包含儿童类C基抽象类的阵列++(Array of base abstract class conta

2019-08-01 14:26发布

所以我有一个一流的,我们说:

//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 ++中做到这一点?

编辑:这将是“可接受的”在受保护的部分中添加一个默认的构造函数,并使用顶部的载体或数组?

Answer 1:

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

typedef std::array<std::unique_ptr<Top>,3> Tops;
Tops tops =
{{
    new MiddleA( "Kuku", 1337 ),
    new MiddleB( "Hoi", 42.0 ),
    new MiddleC()
}};

唯一的事情,你必须对你的顶部虚析构函数。 没有虚析构函数,你只能使用shared_ptr的,别人也会未定义行为导致当对象被销毁。



Answer 2:

是。 你可以这样来做。

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

但您将只能够调用的GetName()函数。 你不会能够调用其他方法。



文章来源: Array of base abstract class containing children class in C++