C++如何创建一个数组的子类使用基类

C++ how to create a array of subclass use baseclass

本文关键字:数组 子类 基类 一个 何创建 创建 C++      更新时间:2023-10-16

假设我有三个这样的类:

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

如何创建混合了sub1sub2的数组?那么用CCD_ 3调用子类方法?

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

  • 公共基类指针,在您的例子中是base*。这通常拥有对象,并且是手动(取消)分配的(也就是说,您需要调用newdelete)。这是最常见的选择。你可以稍后尝试智能指针,但让我们先了解基本知识
  • 公共基类引用,在您的情况下,是base&。常见的约定是,它不拥有对象(尽管这不是语言限制),因此它主要用于引用存储在另一个容器中的对象。既然你需要把它们存放在某个地方,我现在不会选择这个,但以后可能会派上用场
  • std::variant<>(或boost::variant<>),这是一个有区别的并集,也就是说,一个只存储一个列出的项的类,并且知道它存储的是哪一个。您不需要公共基类,但即使您有一个,它也很酷,因为它倾向于在本地存储对象,因此当您有足够的缓存时,可能会更快
  • union,类似于变体,但不知道存储的类型。本地存储是有保证的,如果您写入一个字段并读取另一个字段,则UB也是如此
  • 编译器特定的解决方案。如果知道你的类大小相同(在这种情况下,它们是相同的),并且你确信有非类型化内存,那么你可以存储基类,只要你总是使用地址和->运算符,它就会"正常工作"。请注意,这是UB的平方,我只是列出它,因为您可能会遇到类似的代码。还要注意的是,在这种情况下,仅仅拥有union并不能删除UB——在我们有权访问虚拟表指针之前,这只能通过手动处理虚拟函数来完成