C ++如何创建子类数组使用baseclass

时间:2016-07-23 20:06:48

标签: c++

假设我有三个这样的类:

class base {
//some data
method();
};

class sub1 : base {
//some data
//overrides base method
method();
};

class sub2: base {
//some data
//overrides base methods
method();
};

如何创建与sub1sub2混合的数组?然后用base调用子类方法?

1 个答案:

答案 0 :(得分:1)

好的,让我们解决这个问题。首先,你可能意味着virtual method();,可能带有返回类型,可能带有参数。没有虚拟,基类指针和引用不会知道重写的方法。其次,使析构函数虚拟化。这样做直到你知道为什么需要(delete (base*) new derived;) - 然后继续这样做,直到你所有的邻居都知道你需要为什么。第三,可悲的是,所有标准。 C ++容器是同构的(存在Boost中的非标准异构容器类对象),因此您需要找到一个常见且能以某种方式处理这些类型的对象。常见的选择是:

  • 公共基类指针,在您的情况下为base*。这通常拥有对象并手动(de)分配(即,您需要调用newdelete)。这是最常见的选择。您可以稍后尝试使用智能指针,但请先了解基础知识。
  • 公共基类引用,在您的情况下为base&。常见的惯例是,它不拥有该对象(虽然这不是语言限制),因此它主要用于引用存储在另一个容器中的对象。由于你需要将它们存储在某个地方,我现在不会选择这个,但以后它可能会派上用场。
  • std::variant<>(或boost::variant<>),这是一个有区别的联盟,也就是说,一个存储一个且只有一个列出的项目的类知道它是哪一个商店。你不需要一个共同的基类,但即使你有一个基类,它也很酷,因为它倾向于在本地存储对象,因此当你有足够的缓存时,可能更快。
  • union,它类似于变体,但不知道存储的类型。保证本地存储,如果您编写一个字段并阅读另一个
  • ,则保证UB
  • 编译器特定的解决方案。如果您知道您的类具有相同的大小(在这种情况下,它们是)并且您确定您拥有无类型内存,那么您可以存储基础如果您始终使用地址和->运算符,那么它就可以正常工作&#39; ll&#39;请注意,这是UB平方,我只是列出这个,因为您可能会遇到类似的代码。另请注意,在这种情况下,简单地使用union不会删除UB - 直到我们可以访问虚拟表指针,这只能通过手动处理虚函数来完成。