为什么默认情况下析构函数不是虚拟的

简介: 为什么默认情况下析构函数不是虚拟的

因为很多类并不是设计来作为基类使用的, 虚函数仅在用作派生类对象接口的类中有意义(通常分配在堆上并通过指针或引用访问)。

那么我什么时候应该声明一个析构函数为虚拟的呢? 每当该类具有至少一个虚函数时。 拥有虚函数表明一个类是作为一个派生类的接口,如果是派生类的对象可以通过指向基类的指针销毁。 例如:

class Base {

       // ...

       virtual ~Base();

   };


   class Derived : public Base {

       // ...

       ~Derived();

   };


   void f()

   {

       Base* p = new Derived;

       delete p;    // 用于确保调用 ~Derived 的虚拟析构函数

   }    

如果 Base 的析构函数不是虚拟的,Derived 的析构函数就不会被调用 - 可能产生不良影响,例如 Derived 拥有的资源不 被释放

 

相关文章
|
6月前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
127 4
|
6月前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
编译器 C++
46 C++ - 非自动继承的函数
46 C++ - 非自动继承的函数
46 0
|
9月前
|
设计模式 算法 编译器
【C++ 析构函数】C++ 私有析构函数的作用
【C++ 析构函数】C++ 私有析构函数的作用
165 1
|
9月前
|
编译器 C语言 C++
类的6个默认成员函数(上)
类的6个默认成员函数(上)
50 0
|
9月前
|
编译器 C++
C++:类的默认成员函数
C++:类的默认成员函数
94 0
|
9月前
|
存储 编译器 C++
类的默认成员函数(C++)
1.构造函数 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个成员函数都初始值,并且在对象的整个生命周期内只调用一次。
100 0
|
存储 编译器 C++
C++中类的几个默认成员函数
C++中类的几个默认成员函数
|
存储 Cloud Native Linux
C++什么时候生成默认拷贝构造函数
C++什么时候生成默认拷贝构造函数
|
编译器 C++
【C++】类的6个默认成员函数详解(上)
【C++】类的6个默认成员函数详解
171 0