C++如何创建一个数组的子类使用基类
C++ how to create a array of subclass use baseclass
假设我有三个这样的类:
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
的数组?那么用CCD_ 3调用子类方法?
好的,让我们来解决这个问题。首先,您可能指的是virtual method();
,可能带有返回类型,可能带有参数。如果没有虚拟,基类指针和引用将不知道被重写的方法。第二,使析构函数成为虚拟的。这样做直到你知道为什么需要(delete (base*) new derived;
)-然后继续这样做,直到你的邻居都知道你为什么需要。第三,可悲的是,所有的std.C++容器都是同质的(Boost中存在类似非std.异构容器的对象),因此你需要找到一个通用的对象,并且能够以某种方式处理这些类型。常见的选择有:
- 公共基类指针,在您的例子中是
base*
。这通常拥有对象,并且是手动(取消)分配的(也就是说,您需要调用new
和delete
)。这是最常见的选择。你可以稍后尝试智能指针,但让我们先了解基本知识 - 公共基类引用,在您的情况下,是
base&
。常见的约定是,它不拥有对象(尽管这不是语言限制),因此它主要用于引用存储在另一个容器中的对象。既然你需要把它们存放在某个地方,我现在不会选择这个,但以后可能会派上用场 std::variant<>
(或boost::variant<>
),这是一个有区别的并集,也就是说,一个只存储一个列出的项的类,并且知道它存储的是哪一个。您不需要公共基类,但即使您有一个,它也很酷,因为它倾向于在本地存储对象,因此当您有足够的缓存时,可能会更快union
,类似于变体,但不知道存储的类型。本地存储是有保证的,如果您写入一个字段并读取另一个字段,则UB也是如此- 编译器特定的解决方案。如果知道你的类大小相同(在这种情况下,它们是相同的),并且你确信有非类型化内存,那么你可以存储基类,只要你总是使用地址和
->
运算符,它就会"正常工作"。请注意,这是UB的平方,我只是列出它,因为您可能会遇到类似的代码。还要注意的是,在这种情况下,仅仅拥有union
并不能删除UB——在我们有权访问虚拟表指针之前,这只能通过手动处理虚拟函数来完成
相关文章:
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- std::数组派生类聚合初始化
- 包含不同大小静态数组的类的多个实例
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- 如何将移动平均线写入数组列表类?
- 如何使用对象数组访问类中的变量?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 具有使用其他类对象的数组的类
- 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc
- 动态数组模板类:ostream&运算符友元函数的问题
- 如何在具有指向对象的指针数组的类中创建复制构造函数和析构函数,其中对象本身具有指向整数的指针数组
- 如何在C 中创建对象数组或类数组
- 如何将二维数组作为类中的私有变量,然后在构造函数中设置它
- 在标准C++中复制 C++/CLI 多维数组模板类
- 使用带有对象的数组调用类中的方法,错误"non-class type",c++
- 何时从数组删除类指针
- C 如何用数组在类中创建子类
- 具有2d数组的类中的否定运算符重载
- 如何为二维数组创建类
- C++:单个超类的数组子类