【发布时间】:2011-08-20 02:40:30
【问题描述】:
假设我有几节课
Alpha 类(基类)
类 Beta(子类 Alpha)
类 Delta(子类 Alpha)
是否可以创建一个vector<Alpha> 并将 Alpha、Beta 和 Delta 类型的对象实例都存储在该向量中,并让该向量正常运行?
如果不是,假设我想拥有某种类似的功能,最好的方法是什么?
【问题讨论】:
-
如果您使用基类指针/智能指针,那么可以。如果您存储值对象(而不是指向对象的指针),那么最大的担忧是对象切片(如果您有
virtual方法等可能会出现意外行为)。 -
您是否希望元素根据它们是
Alphas、Betas 还是Deltas 而表现出不同的行为?还是您希望他们在vector中时都表现得像Alphas? (无法想象第二个的用途,但也许你想要它。) -
它们需要表现得像 Beta 和 Delta 一样,并且它们会有一些需要执行的通用方法名称。 Seth 的虚方法声明听起来非常接近我的需要。只要虚拟方法调用可以窥探到实际对象的属性,我就会被设置。
-
那么你真的想在你的类中使用
virtual方法,然后使用指向基类的指针(最好是智能指针),并将它们存储在你的向量中。每个类的virtual方法都可以访问其所属类的成员字段(但只能访问父类的public和protected成员)。 -
@Jasconius - 我也这么认为。 Seth 的版本是您所需要的,但如果您想避免内存管理,您可以使用 Ethan 建议的智能指针。是的,虚拟方法可以做任何常规方法可以做的事情。 唯一的区别在于,在
Alpha *a = new Beta; a->method()中,如果method是常规的,它将调用Alpha::method,但如果它是虚拟的,它将调用Beta::method。 (这样做的成本要高得多,因此并非所有方法都应该是虚拟的,但它是 C++ - 您只需为需要的部分付费。)
标签: c++ oop vector subclassing