如何申报"未知"派生类作为基类作为成员并允许调用成员函数的派生版本?

时间:2017-10-25 15:58:40

标签: c++ virtual base derived-class

我目前正在尝试将类(myClass)的成员设置为Base类的某些派生类(Derived1,Derived2,...)。由于类不知道它是哪个派生类,所以成员类型设置为Base类,它只在构造时设置为派生类。

派生类都有一个共同的成员函数,它以不同的方式实现(基类有一个虚拟版本)。但是,当从myClass调用this函数时,它总是调用Base类版本而不是派生类。

class Base
{
public:
    Base(){}
    virtual void who() { cout << "this is Base"; }
}

class Derived1 : public Base
{
public:
    Derived1() : Base() {}
    void who() { cout << "this is Derived1"; }
}

class myClass
{
private:
    Base unknownDerived;
public:
    myClass(const Base& inputDerived) { unknownDerived = inputDerived; }
    void whosthere() { unknownDerived.who(); }
}

上面的输出是&#34;这是Base&#34;,而是调用基类版本。

有没有办法在不指定实际派生类的情况下包含成员,但能够调用其特定函数(who())?

非常感谢!

1 个答案:

答案 0 :(得分:4)

当您将Base声明为成员时,Base就是您实际获得的。即使您为其指定了派生类型,也会遇到所谓的“切片”,其中只复制派生对象的基础部分,并且您的对象仍然是基础。

在C ++中,多态只能通过指针引用来工作。

要在myClass中创建一个真实的成员对象(不是对象的间接),你需要让myClass有一个模板参数,你可以在编译时决定它将是什么类型。否则,您必须使用指针和/或引用。

现在你必须清楚内存所有权和适当的清理。您可以让调用者转移对象的所有权(通过获取unique_ptr),或者您可能坚持Base具有虚拟clone()函数来创建对象的深层副本。此外,您很可能还需要在基类中使用虚拟析构函数。