C++ 包含C+中子类的基抽象类数组+;

C++ 包含C+中子类的基抽象类数组+;,c++,class,inheritance,abstract,C++,Class,Inheritance,Abstract,所以我有一个一流的,比方说: //Top.h #pragma once #include <string> using std::string; class Top { protected: string name; public: virtual string GetName() = 0; } //MiddleA.h #pragma once #include "Top.h" class MiddleA : public Top

所以我有一个一流的,比方说:

//Top.h
#pragma once
#include <string>
using std::string;

class Top
{
    protected:
        string name;
    public:
        virtual string GetName() = 0;
}
//MiddleA.h
#pragma once
#include "Top.h"

class MiddleA : public Top
{
    protected:
        int value;
    public:
        MiddleA(string, int);
        string GetName();
        int GetValue();
}

//MiddleB.h
class MiddleB : public Top
{
    protected:
        double factorial;
    public:
        MiddleB(string, double);
        string GetName();
        double GetFactorial();
        double Calculate(int);
}
现在,我需要的是一个数组或任何东西,它可以包含多个MiddleA、MiddleB类型的对象,或者任何继承自这两个类的类。在C++中有没有办法做到这一点?


编辑:在受保护部分中添加默认构造函数并使用向量或Top数组是否“可接受”?

是。你可以这样做

Top* array[3] = { new Top(parms), new MiddleA(params), new MiddleB(params) };

但您将只能调用GetName()函数。您将无法调用其他方法。

是。你可以这样做

Top* array[3] = { new Top(parms), new MiddleA(params), new MiddleB(params) };

但您将只能调用GetName()函数。您将无法调用其他方法。

使用C++的指针和数组:

typedef std::array<std::unique_ptr<Top>,3> Tops;
Tops tops =
{{
    new MiddleA( "Kuku", 1337 ),
    new MiddleB( "Hoi", 42.0 ),
    new MiddleC()
}};
typedef标准::阵列顶部;
顶=
{{
新米德拉(“库库”,1337年),
新米德尔布(“海”,42.0),
新米德尔克()
}};

你们唯一需要做的就是把虚拟析构函数放在你们的顶部。没有虚拟析构函数,您只能使用shared_ptr,其他对象在销毁时将导致未定义的行为。

使用C++的指针和数组:

typedef std::array<std::unique_ptr<Top>,3> Tops;
Tops tops =
{{
    new MiddleA( "Kuku", 1337 ),
    new MiddleB( "Hoi", 42.0 ),
    new MiddleC()
}};
typedef标准::阵列顶部;
顶=
{{
新米德拉(“库库”,1337年),
新米德尔布(“海”,42.0),
新米德尔克()
}};

你们唯一需要做的就是把虚拟析构函数放在你们的顶部。如果没有虚拟析构函数,您只能使用shared_ptr,当对象被销毁时,其他对象将导致未定义的行为。

您可以创建一个std::vector,但要进行诸如
GetValue()
GetFraction()
之类的函数调用,除非使用
dynamic_cast
,否则将无法工作。你是否需要调用
GetValue()
?是的,向量会更好。你可以创建一个std::vector,但是要调用
GetValue()
GetFraction()
这样的函数,除非你使用
动态转换
,否则它不会工作。您是否需要调用
GetValue()
?是的,向量会更好。一旦您设法找出数组元素的对象类型并将其转换为该类型,就可以调用其他成员函数;例如,通过使用
dynamic\u cast
yea。。你可以强制转换它,然后调用其他成员。一旦你设法弄清楚数组元素是什么类型的对象并将其强制转换为该类型,你就可以调用其他成员函数;例如,通过使用
dynamic\u cast
yea。。你可以投,然后给其他成员打电话。我真的很喜欢你的方式。我真的很喜欢你的方式。