我目前正在尝试将一个类(myClass)的成员设置为基类的某些派生类(Derived1,Derived2等)。由于类不知道它是哪个派生类,因此将成员类型设置为基类,仅在构造时将其设置为派生类。

派生类都具有一个通用的成员函数,该成员函数的实现方式有所不同(基类具有虚拟版本)。但是,当从myClass调用this函数时,它将始终调用基类版本而不是派生类。

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(); }
}

上面的输出是“this is Base”,而是调用了基类版本。

有没有一种方法可以包括一个成员而无需指定它的实际派生类,但是可以调用其特定函数(who())?

非常感谢!

最佳答案

当您将Base声明为成员时,Base实际上是您获得的。即使为它分配了派生类型,您也会遇到所谓的“ slice ”,即仅复制派生对象的基本部分,而您的对象仍然是基本。

在C++中,多态仅通过指针和引用起作用。

要在myClass中创建真正的成员对象(而不是对象的间接引用),您将需要使myClass具有模板参数,并且可以在编译时确定其类型。否则,您必须使用指针和/或引用。

现在,您必须清除有关内存所有权和适当清理的信息。您可以使调用方转移对象的所有权(通过采用unique_ptr),或者您可以坚持认为Base具有虚拟的clone()函数来创建对象的深拷贝。此外,您很可能在基类中也将需要虚拟析构函数。

关于c++ - 如何将 “unknown”派生类声明为成员的基类,并允许调用成员函数的派生版本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46937041/

10-13 08:18