假设我有三个这样的类:
class base {
//some data
method();
};
class sub1 : base {
//some data
//overrides base method
method();
};
class sub2: base {
//some data
//overrides base methods
method();
};
如何创建与sub1
和sub2
混合的数组?然后用base
调用子类方法?
答案 0 :(得分:1)
好的,让我们解决这个问题。首先,你可能意味着virtual method();
,可能带有返回类型,可能带有参数。没有虚拟,基类指针和引用不会知道重写的方法。其次,使析构函数虚拟化。这样做直到你知道为什么需要(delete (base*) new derived;
) - 然后继续这样做,直到你所有的邻居都知道你需要为什么。第三,可悲的是,所有标准。 C ++容器是同构的(存在Boost中的非标准异构容器类对象),因此您需要找到一个常见且能以某种方式处理这些类型的对象。常见的选择是:
base*
。这通常拥有对象并手动(de)分配(即,您需要调用new
和delete
)。这是最常见的选择。您可以稍后尝试使用智能指针,但请先了解基础知识。base&
。常见的惯例是,它不拥有该对象(虽然这不是语言限制),因此它主要用于引用存储在另一个容器中的对象。由于你需要将它们存储在某个地方,我现在不会选择这个,但以后它可能会派上用场。std::variant<>
(或boost::variant<>
),这是一个有区别的联盟,也就是说,一个存储一个且只有一个列出的项目的类和知道它是哪一个商店。你不需要一个共同的基类,但即使你有一个基类,它也很酷,因为它倾向于在本地存储对象,因此当你有足够的缓存时,可能更快。 union
,它类似于变体,但不知道存储的类型。保证本地存储,如果您编写一个字段并阅读另一个->
运算符,那么它就可以正常工作&#39; ll&#39;请注意,这是UB平方,我只是列出这个,因为您可能会遇到类似的代码。另请注意,在这种情况下,简单地使用union
不会删除UB - 直到我们可以访问虚拟表指针,这只能通过手动处理虚函数来完成。