C++ std::vector 中的虚拟析构函数继承
C++ virtual destructor inheirtance from std::vector
所以我正在为C++考试而学习,我遇到了以下问题:
如果要从
std::vector
继承,您会创建一个虚拟的 破坏者?
既然std::vector
没有虚拟析构函数,我创建一个有什么意义吗?
我认为std::vector
是一条红鲱鱼。首先让我把问题改写为
如果你要编写一个继承自
std::vector
的类A
,你会给它一个虚拟析构函数吗?
然后这里唯一相关的是std::vector
是否已经有一个虚拟析构函数。如果是这样,则A
的析构函数将始终自动为虚拟的,无论您是否使用virtual
关键字指定它。但是std::vector
没有虚拟析构函数。因此,可以删除对它的引用:
如果你要写一个类
A
,你会给它一个虚拟析构函数吗?
答案仍然是,如果A
从任何其他具有虚拟析构函数的类继承,它将自动是虚拟的,因此唯一有趣的情况是:
如果你要编写一个类
A
,它不继承任何具有虚拟析构函数的类,你会给它一个虚拟析构函数吗?
现在这是一个非常普遍的问题,如评论中所述,这取决于您是否打算将该类用作多态基,即您是否要允许删除通过指向A
的指针/引用从A
派生类型的对象。
如果您的设计要求通过指向该类的指针删除从该类派生的类型的对象,则类需要一个虚拟析构函数。那是
class base {
};
class derived : public base {
};
void f() {
base *bp = new derived;
delete bp; // undefined behavior: base does not have a virtual destructor
}
std::vector
,根据设计没有虚拟析构函数。它不应用作基类。
因此,如果您的(有缺陷的(设计要求从std::vector<whatever>
派生并从派生类型派生,并通过指向基类型的指针删除最终类型的对象,则基类型必须具有虚拟析构函数。但这与std::vector
或您的基本类型派生自std::vector
的事实无关。之所以需要它,是因为基类的使用方式。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数