c++ - 如果子类没有非静态成员或析构函数,我是否需要虚拟析构函数?

标签 c++ c++11 virtual-destructor

<分区>

我正在研究文件描述符的类层次结构,其中基类持有一个 int 并在销毁期间调用 close 并且子类不添加任何虚拟方法或数据成员,只是它们的构造不同(例如,named_file_filedes 采用路径并在 ctor 中使用 open 初始化基础)或非虚拟成员函数(例如,您只能调用 keventkqueue_filedes 上)。鉴于此,基类是否需要虚拟析构函数?子类的大小都是一样的,而且它们都没有自定义销毁逻辑。标记为 c++11,因为这是我的目标标准版本。

最佳答案

如果您打算通过删除基类指针来销毁派生类对象,则需要一个虚拟 析构函数。如:

class Foo {};
class Bar : public Foo {}

int main()
{
  Foo* f = new Bar;
  delete f; // << UNDEFINED BEHAVIOR without virtual destructor in base classe
}

如果您需要对象是多态的,您还需要至少 1 个 virtual 方法——例如,如果您打算使用 dynamic_cast 来从基础到派生。通常在这种情况下会提供一个虚拟析构函数。只有一个虚拟析构函数就足以确保该类是多态的。

关于c++ - 如果子类没有非静态成员或析构函数,我是否需要虚拟析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937739/

相关文章:

c++ - 这个表达是什么意思? SP_DEVINFO_DATA 开发数据 = {sizeof(SP_DEVINFO_DATA)};

c++ - 如何从可执行文件的多重/双重代码签名中检索信息

c++ - 具有智能指针附加继承对象的深拷贝

c++ - 就地构建 std::function 目标

c++ - 合并 unique_ptr 的两个 vector 时“使用已删除的函数”

c++ - 编译器在 GCC 和 MSVC 中生成析构函数和警告

c++ - boost 变换迭代器和 c++11 lambda

c++ - 静态局部变量可以减少内存分配时间吗?

c++ - 当派生类的析构函数是虚拟的而基类的 dtor 不是时代码崩溃

c++ - 在派生对象之后调用两次基本析构函数?