gpt4 book ai didi

c++ - 如何将一个 "unknown"的派生类声明为基类的成员,并允许派生版本的成员函数被调用?

转载 作者:行者123 更新时间:2023-11-30 01:38:55 24 4
gpt4 key购买 nike

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

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

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”,调用的是Base类版本。

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

非常感谢!

最佳答案

当您将 Base 声明为成员时,Base 就是您实际得到的。即使您将 Derived 类型分配给它,您也会体验到所谓的“切片”,其中仅复制派生对象的 Base 部分,而您的对象仍然是 Base。

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com