c++ - C++ 中包含子类的基本抽象类数组

标签 c++ class inheritance abstract

所以我有一个 Top 类,假设:

//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++ 中执行此操作?

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

最佳答案

使用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,其他对象将在对象被销毁时导致未定义的行为。

关于c++ - C++ 中包含子类的基本抽象类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12942979/

相关文章:

Java:当对象被声明为基类时访问派生类的成员

c++ - 通过拾取点最小化视差

c++ - 重新排序可变参数

javascript - 从父类中的静态方法访问子类中定义的属性 - javascript

c++ - 构造函数和析构函数继承

javascript - 改变 javascript 中特定类中调用函数的方式

c++ - boost asio 超时

c++ - 我对 C++ 中 '<<' 的运算符重载的使用感到困惑

android - 制作字体助手类

c++ - 类函数可以有不同类对象的参数吗?