C++ std::vector 中的虚拟析构函数继承

C++ virtual destructor inheirtance from std::vector

本文关键字:虚拟 析构函数 继承 std vector C++      更新时间:2023-10-16

所以我正在为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的事实无关。之所以需要它,是因为基类的使用方式。