我目前正在尝试将类(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())?
非常感谢!
答案 0 :(得分:4)
当您将Base声明为成员时,Base就是您实际获得的。即使您为其指定了派生类型,也会遇到所谓的“切片”,其中只复制派生对象的基础部分,并且您的对象仍然是基础。
在C ++中,多态只能通过指针和引用来工作。
要在myClass中创建一个真实的成员对象(不是对象的间接),你需要让myClass有一个模板参数,你可以在编译时决定它将是什么类型。否则,您必须使用指针和/或引用。
现在你必须清楚内存所有权和适当的清理。您可以让调用者转移对象的所有权(通过获取unique_ptr),或者您可能坚持Base具有虚拟clone()函数来创建对象的深层副本。此外,您很可能还需要在基类中使用虚拟析构函数。