C++ 如何将基类的未知子类放在一个数据结构中,并在C+中调用重写的基类函数+;

C++ 如何将基类的未知子类放在一个数据结构中,并在C+中调用重写的基类函数+;,c++,templates,inheritance,C++,Templates,Inheritance,我有一个“chain”类,意思是一个用公共基类管理一系列对象的类。 这个链类应该为我添加的任何子类(属于baseClass)执行成员函数processSample(a,b) 我希望以后能够编写更多的子类(使用processSample(a,b)函数),并将它们添加到链中,而无需编辑链类。 我可以在add函数中使用模板,但这并不能解决不同数据类型(大小不同)没有数据结构的问题,对吗 链类中调用的子类的函数都应该从基类重写为virtuals class baseClass { public:

我有一个“chain”类,意思是一个用公共基类管理一系列对象的类。 这个链类应该为我添加的任何子类(属于
baseClass
)执行成员函数
processSample(a,b)

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

类中调用的子类的函数都应该从基类重写为virtuals

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)
    }
}
类基类
{
公众:
虚拟浮点进程示例(int a、float b)
{
}
};
类链
{
常量int maxChilds=20;
?某种类型?所有儿童[maxChilds];
公众:
浮点处理示例(int c、float d)
{
for(int i=0;i
您可能希望使用指针或引用,以避免在创建类时进行初始化或复制操作

比如说

class Chain
{
    const int maxChilds = 20;
    baseClass allChilds[maxChilds];
将创建并初始化一个包含20个基类实例的数组。鉴于:

class Chain
{
    const int maxChilds = 20;
    baseClass* allChilds[maxChilds];
将创建指向基类的指针数组,该数组还可以指向任何子类的实例。请考虑哪个类将负责分配和分配这些实例的内存(这可以在这个类内,或者这个类的调用方/用户-哪一个是理想的将取决于您的设计的其余部分)。您也可以考虑使用智能指针,让它为您管理内存:

同样地:

void addChild(baseClass newChild)
将使用passby value传入newChild的副本(使用基类的复制构造函数),子类的任何实例都将失败或转换为基类的实例。然而,如果你选择:

void addChild(baseClass& newChild)

它将使用pass by reference,函数将接收对原始对象的引用。

virtual的好效果是,您“调用基类的函数”,但将执行派生类的函数

那么
?某种类型?所有儿童[马克斯儿童]
基类allChilds[maxChilds]。链应该是对象的持有者,因此
addChild(…)
不应该接受子类的实例。它应该创建实例并使用(如有必要)std::move将其添加到数组中

备注:这将使您更容易使用

std::vector<baseClass>allChilds;
allChilds.reserve(maxChilds); //reserves the memory but you can still use push back
std::vectorallChilds;
所有儿童保留区(maxChilds)//保留内存,但仍可以使用push back

?某种类型?
->
基本类*
最有可能,但您可能需要
基本类
的簿记计数器,该计数器由
所有儿童
指向。如果不添加
maxChilds
实例,则迭代到
maxChilds
将是致命的。或
std::vector
std::vector
@ChrisD拥有此权限。C++中的原始数组没有<代码> PurthBuffe<代码>方法。或任何方法。数组非常简单,也非常愚蠢。这能回答你的问题吗?请注意,要使
addChild
真正起作用,必须绝对确保添加的节点的生存期与
链的生存期匹配或超过
链的生存期。通常,您需要创建一个寿命更长的实例,并且
Chain
拥有它的所有权。是的,代码中还有很多其他bug需要修复:)。我想我会坚持按要求解决这个问题,特别是因为复制构造函数/传递值行为对于来自Java这样的地方的人来说是一个重要的区别,因为所有东西都是通过引用传递的。