使用抽象类作为模板类型

Ori*_*Ori 4 c++ inheritance abstract-class

我仍然是c ++的新手(来自java).我有一个类型列表Actor.当Actor只包含"真实"方法时,没有问题.我现在想要将这个类扩展到几个类,并且需要将一些方法改为抽象,因为它们不再具体.

正如我所料(从文档中)这是坏消息,因为你无法再实例化Actor,所以当我遍历我的列表时,我遇到了问题.

c ++的方法是什么?

对不起,如果有什么不清楚的话

Mar*_*ork 6

你不能直接处理这个:

正如您所看到的,当类是抽象的时,您无法实例化该对象.
即使不抽象的类,由于切片问题,也无法将派生对象放入列表中.
解决方案是使用指针.

所以第一个问题是谁拥有指针(所有者的响应能力是在其生命周期结束时删除它).

使用std :: list <>,列表通过创建对象的副本并获取副本的所有权来获得所有权.但是指针的析构函数什么都不做.您需要手动调用指针上的delete来获取要激活的obejct的析构函数.所以当std :: list <>需要占有权时,它不是保持指针的好选择.

解决方案1:

// Objects are owned by the scope, the list just holds apointer.
ActorD1   a1; Actor D1 derived from Actor
ActorD2   a2;
ActorD2   a3;

std::list<Actor*>  actorList;
actorList.push_back(&a1);
actorList.push_back(&a2);
actorList.push_back(&a3);
Run Code Online (Sandbox Code Playgroud)

这工作正常,因为列表将超出范围,然后对象一切正常.但这对动态(运行时)创建的对象不是很有用.

解决方案2:

Boost提供了一组处理指针的容器.您赋予容器指针的所有权,当容器超出范围时,容器会破坏对象.

boost::ptr_list<Actor>  actorList;

actorList.push_back(new ActorD1);
actorList.push_back(new ActorD2);
actorList.push_back(new ActorD2);
Run Code Online (Sandbox Code Playgroud)