所以我有一个顶级课程,让我们说:
//Top.h
#pragma once
#include <string>
using std::string;
class Top
{
protected:
string name;
public:
virtual string GetName() = 0;
}
这个类没有任何对象Top实例化,这就是为什么它是一个抽象类。我也有两个中产阶级,让我们说:
//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的向量或数组是否“可接受”?
答案 0 :(得分:3)
使用C ++的指针和数组:
typedef std::array<std::unique_ptr<Top>,3> Tops;
Tops tops =
{{
new MiddleA( "Kuku", 1337 ),
new MiddleB( "Hoi", 42.0 ),
new MiddleC()
}};
只有你必须在你的Top上拥有虚拟析构函数。如果没有虚拟析构函数,您可能只使用shared_ptr,其他会在对象被销毁时导致未定义的行为。
答案 1 :(得分:1)
是肯定的。你可以这样做。
Top* array[3] = { new Top(parms), new MiddleA(params), new MiddleB(params) };
但您只能调用GetName()函数。你无法调用其他方法。