自动使用派生类

时间:2017-03-03 10:42:28

标签: c++ class inheritance

我使用不同的协议进行TTY通信。我开始用C ++实现一些C ++代码。父类包含一些具有一些虚函数的基本函数(write,read ...)。每个协议都是具有特定功能的子类。目前在我的应用程序中,我直接使用我的子类,但我想动态更改协议。

在这种情况下是否可以使用父类作为子类的自动选择器来选择?并且在选择之后仍然使用父母?

例如(简化):

class Parent
{
    void Write();
    void Read();
    void AutomaticProtocolSelector();//depending on the response of the device
    virtual void function1();
    virtual void function2();
};

class protocol1 : public Parent
{
    void function1();
};

class protocol2 : public Parent
{
    void function2();
};


int main(int argc, char const *argv[])
{
    Parent *p;
    p->AutomaticProtocolSelector();//let's say protocol1 is selected
    p->function1(); //execute the function1 in the child class
    ...
}

我已经阅读了一些有关派生类以及使用dynamic_catsstatic_cast的帖子,但这并不是我正在寻找的内容。如果按照我的想法不可能,我会用它。

1 个答案:

答案 0 :(得分:0)

你似乎陷入了一种引导问题。您希望使用指向Parent的指针来创建Parent类的实现。在您的程序中,您将取消引用尚未初始化的指针。

int main(int argc, char const *argv[])
{
    Parent *p;                      // !! Not initialized
    p->AutomaticProtocolSelector(); // The application should crash here
    p->function1();

    // ...
}

最好将你的指针初始化为nullptr,这可能会让一些可疑的东西变得更加明显。

要让Parent类提供自身的实现,您需要一个静态工厂方法。

class Parent
{
public:
    static std::unique_ptr<Parent> createParent();

    void Write();
    void Read();
    virtual void function1();
    virtual void function2();
};

然后可以在您的应用程序中使用它,如下所示:

int main()
{
    auto p = Parent::createParent();
    p->function1();
    p->function2();

    // ...
}

但是,这也意味着在Parent的实现中,您需要了解一些或所有可能的子类。这感觉有点倒退,您通常不希望您的父类知道他们的子类。

正如Alexandre Thouvenin所建议的那样,最好将儿童班的建设转移到一个单独的工厂班级。

class ParentFactory
{
public:
    ParentFactory() = default;

    std::unique_ptr<Parent> createParent() const;
};

createParent方法的实现中,然后创建其中一个子类的实例。

然后在您的应用程序代码中,创建一个工厂并使用它来获取Parent类的实现。

int main()
{
    ParentFactory factory;

    auto p = factory.createParent();
    p->function1();
    p->function2();

    // ...
}

注意:我使用了一些C ++ 11功能,希望你不介意。