如何制作所有从一个基类继承的对象列表

Posted

技术标签:

【中文标题】如何制作所有从一个基类继承的对象列表【英文标题】:How to make a list of objects which all inherit from one base class 【发布时间】:2015-09-01 19:37:55 【问题描述】:

我有一个主要的抽象类和 4 个子类,它们都继承自抽象类。 我想制作一个列表,其中一个元素可以是这 4 个类中的任何一个。

Test1.h

class Test 
public:
    Test();
    virtual void someFunc();

    void getTest();
    void setTest(int test);

protected:
    int test;
;

Test2.h:

#include "Test.h"

class Test2 : public Test
public:
    Test2();
    void someFunc();

    int otherFunc();

;

还有Test3、Test4和Test5...

来源.cpp:

#include <iostream>
#include "Test1.h"
#include "Test2.h"
#include "Test3.h"
#include "Test4.h"
#include "Test5.h"

int main() 
    list<Test> testList; //does not work
    Test2 t = Test2();
    Test3 t3 = Test3();
    Test4 t4 = Test4();
    testList.push_back(t);
    testList.push_back(t4);

有没有办法制作一个可以包含所有这些元素的列表?

【问题讨论】:

您是否希望列表拥有对象(即您是否希望在删除列表时删除它们)? 【参考方案1】:

您可以创建基类Test 指针的向量,例如:

std::vector<Test*>

如果可以的话,我宁愿推荐使用智能指针,例如:

std::vector<std::unique_ptr<Test>>

【讨论】:

成功了!有没有办法可以设置向量的大小随着元素的添加而动态增加,而不必设置初始大小? 使用std::vector,您不必自己增加大小。 push_back() 将为您完成工作。所以一定要使用std::vector【参考方案2】:

只要您不希望列表拥有对象,您就可以使用基类指针向量:

std::vector<Test*> testList;
Test2 t = Test2();
Test4 t4 = Test4();
testList.push_back(&t);
testList.push_back(&t4);

如果您希望列表拥有您需要动态分配对象的对象,则基类需要有一个虚拟析构函数,并且您需要记住删除指针或使用智能指针:

class Test 
public:
    virtual void someFunc();
    virtual ~Test()
;

std::vector<std::unique_ptr<Test>> testList;
testList.push_back(std::make_unique<Test2>());
testList.push_back(std::make_unique<Test4>());

【讨论】:

以上是关于如何制作所有从一个基类继承的对象列表的主要内容,如果未能解决你的问题,请参考以下文章

大型程序的工具——多重继承与虚继承

获取一份清单 从抽象类继承的对象列表中的所有派生类型

构造函数继承问题c

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

面向对象3大特性之一:继承

(C ++)如何在继承子类后删除基类?