繁体   English   中英

如何将基类 class 的未知子类放入一个数据结构中,并在 C++ 中调用覆盖的基类 class function

[英]How to put unknown child classes of a base class in one data structure and call an overridden base class function in C++

我有一个“链”class,意思是一个 class,它管理一个具有公共基数 class 的对象序列。这个链 class 应该为任何子对象 8839818195188 执行成员 function processSample(a, b) baseClass

我希望稍后能够编写更多子类(使用processSample(a, b)函数),并将它们添加到链中而无需编辑链 class。我可以在add function 中使用模板,但这不会'解决了没有针对不同数据类型(不同大小)的数据结构的问题吧?

Chain class 中调用的子函数都应该被基 class 的虚拟函数覆盖。

class baseClass
{
public:

    virtual float processSample(int a, float b)
    {

    }
};


class Chain
{
    const int maxChilds = 20;
    ?sometype? allChilds[maxChilds];

public:
    float processSample(int c, float d)
    {
        for (int i = 0; i < maxChilds; i++)
        {
            input = allChilds[i].processSample(a, b);
        }

        return input;
    }

    void addChild(?sometype? newChild)
    {
       allChilds.push_back(newChild)
    }
}

您可能希望使用指针或引用,以避免初始化或复制操作作为创建 class 的一部分。

例如

class Chain
{
    const int maxChilds = 20;
    baseClass allChilds[maxChilds];

将创建并初始化一个包含 20 个 baseClass 实例的数组。 而这个:

class Chain
{
    const int maxChilds = 20;
    baseClass* allChilds[maxChilds];

将创建一个指向 baseClass 的指针数组,它也可以指向任何子类的实例。 请考虑哪个 class 将负责这些实例的 memory 的分配和取消分配(这可以在这个 class 中,或者这个 class 的调用者/用户 - 哪个是理想的将取决于您设计的 rest) . 您也可以考虑改用智能指针,让它为您管理 memory: https://en.cppreference.com/book/intro/smart_pointers

相似地:

void addChild(baseClass newChild)

将使用传值方式传入 newChild 的副本(使用 baseClass 的复制构造函数),子类的任何实例要么失败,要么被转换为 baseClass 的实例。 而如果您将 go 改为:

void addChild(baseClass& newChild)

它将改用引用传递,function 将收到对原始 object 的引用。

virtual 的好处是,你“调用基类的 function”,但是派生的 class 的 function 将被执行。

那么?sometype? allChilds[maxChilds]; ?sometype? allChilds[maxChilds]; baseClass allChilds[maxChilds]; . 链应该是对象的持有者,所以addChild(...)不应该接受子类的实例。 它应该创建实例并使用(如有必要) std::move 将其添加到数组中。

备注:使用起来会更方便

std::vector<baseClass>allChilds;
allChilds.reserve(maxChilds); //reserves the memory but you can still use push back

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM