c++ - 从基类中选择子类......可能吗?

标签 c++ class-design

我正在学习 C++,但遇到了一个问题。我需要一种在基类中使用特定子类的方法。这有意义还是我使用了错误的方法? SelectBrand 应该选择子类,我该怎么做?

下面是我的简化类:


-----
class Protocol {

public:

    Protocol() {};
    ~Protocol() {};
    int openPort();
    int readPort(char *buffer);

.....

private:

        Protocol (const Protocol&);
};

int Protocol::openPort() {......};

int Protocol::readPort() {.........};

/***********************************************************************************/

class Device{

public:

        Device(Protocol& port):_protocol(port){}
        ~Device();
        virtual int getEvent(char *buffer) { return -1; }
        int Device::selectBrand();

        ..............

protected:

        Protocol& _protocol;

private:

        int brand;
        Device(const Device&orig);
};

Device::~Device() {}

int Device::selectBrand() {

       ......

       switch (X)

            case 1:

                    "use subclass Brand_B"

            case 2:

                    "use subclass Brand_B"

        .......

}

/***********************************************************************************/

class Brand_A:public Device {

public:

        Brand_A(Protocol& port);
        ~Brand_A();
        int getEvent(void *rawData);  

private:

        Brand_A(const Brand_A&);
};

Brand_A::Brand_A(Protocol& port):Device(port) {}

Brand_A::~Brand_A() {}

int Brand_A::getEvent(void *rawData) {


            .... readPort(......);

}

/***********************************************************************************/

class Brand_B:public Device {

public:

        Brand_B(Protocol& port);
        ~Brand_B();
        int getEvent(void *rawData);  

private:

        Brand_B(const Brand_B&);

};

Brand_B::Brand_B(Protocol& port):Device(port) {}

Brand_B::~Brand_B() {}

int Brand_B::getEvent(void *rawData) {


            .... readPort(......);

}

/* main **********************************************************/

int main(int argc, char **argv) {

        Device *mydev;

        char *buffer;

    ..............

    mydev->selectBrand();

    ..........

    mydev->getEvent(buffer);

    ...........

}

最佳答案

这不是个好主意。

通常答案是dynamic_cast,但是从基类调用后代的特定行为通常是一个糟糕的设计标志。

您可以尝试反转类层次结构并使用模板。

关于c++ - 从基类中选择子类......可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4240774/

相关文章:

c# - 更改继承属性的类型(到继承类型)

oop - 使用泛化而不是聚合

c++ - 使 boost::fusion::result_of::as_set<> 's instance doesn' t 调用其元素的构造函数

c++ - 如何使用 Win32 api 将 TreeView 项目设置为可见/不可见

C++,在没有每个成员分配的情况下重置类成员

c++ - 如何设计具有 "annotated"字段的类?

java - 隐式与显式数据结构

c++ - 正确使用c++标准队列

c++ - 当代码不严格符合标准时,如何强制 clang 抛出错误?

c++ - 说一个C++对象是可 move 的,这到底意味着什么?