为什么需要定义虚的析构函数?

并不是所有的类都要定义虚的析构函数.因为在C++中引入虚函数是有代价的.

只要当你需要通过delete ptr删除一个对象的时候,你才需要定义虚的析构函数.

看下面的代码段:

class Base{
public:
     Base(int i):m(i){}
     virtual void doSomeThing()=0;
private:
    int m;
};

class Derived:public Base{
public:
     Derived(int v):Base(v){}
     void doSomeThing(){
    }
};

int main(){

    Derived* d = new Derived(11);
    d->doSomeThing();
    delete d;
}

一切都工作得很好,直到有一天,你学习了设计模式,明白我们要面向接口编程,而不是面向实现编程.于是代码改成这样:

int main(){

    Base* d = new Derived(11);
    d->doSomeThing();
    delete d;
}

于是问题来了,delete的时候是要调用析构函数的,可是我们的析构函数不是虚函数,于是只会调用Base的析构函数

这样派生类就析构不完全,程序里隐含了bug.

时间: 2024-10-21 15:36:45

为什么需要定义虚的析构函数?的相关文章

【转】深入理解C++的动态绑定和静态绑定 & 不要重定义虚函数中的默认参数

为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2.对象的动态类型:目前所指对象的类型.是在运行期决定的.对象的动态类型可以更改,但是静态类型无法更改.关于对象的静态类型和动态类型,看一个示例: class B { } class C : public B { } class D : public B { } D* pD = new D();//p

继承和动态内存分配——需要为继承类定义 显式析构函数、复制构造函数和赋值运算符

当派生类使用了new时,必须为派生了定义显式析构函数.复制构造函数和赋值运算符.(这里假设hasDMA类继承自baseDMA类)显式析构函数: baseDMA::~baseDMA() // takes care of baseDMA stuff { delete [] label; } hasDMA::~hasDMA() { delete [] style; } 复制构造函数: baseDMA::baseDMA(const baseDMA & rs) { label = new char[std

使用Python定义构造函数和析构函数

#定义类 class Student: #名称 name="张三"; #构造方法 def __init__(self): print ("----构造方法被调用----") #析构方法 def __del__(self): print("----析构方法被调用------") #自我介绍的方法 def show(self): print("你好:我是%s"%self.name) #实例化对象 zhangsan= Student

C++ struct结构体定义构造函数和析构函数,构造函数参数从VS2017平台转换到Qt5平台下构建出错,采用字符集转换函数将string类型转换为wstring,构建仍然出错!

调试win硬件驱动,需要利用VS编译的win驱动构建自己的Qt5GUI程序: 其中部分win驱动源码如下 device_file::device_file(const std::string& path, DWORD accessFlags) { h = CreateFile(path.c_str(), accessFlags, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);} 调用winAPI CreateFile函数在win中字符编

虚析构函数的作用

1  class ITest 2  { 3  public: 4      virtual void Test() = 0; 5 6  }; 7 8  class CTest : public ITest 9  { 10 public: 11     CTest()  { printf("constructor.n"); }; 12     ~CTest() { printf("destructor.n"); }; 13     virtual void Test(

析构函数什么情况下要定义为虚函数?

原文出处:点击我:) 1.第一段代码 #include<iostream>using namespace std;class ClxBase{public:    ClxBase() {};    ~ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;}; void DoSomething() { cout << "Do someth

为什么有时候需要把析构函数定义为虚函数

为什么有时候需要把析构函数定义为虚函数 析构函数的作用是在对象撤销之前做必要的清理现场的工作,当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后在调用基类的析构函数,但是用new运算符建立了一个派生类对象,并且把他赋给基类指针,那么当用delete运算符撤销这个指针指向的存储空间的时候,系统会只执行基类的析构函数,而不执行派生类的析构函数.

为什么构造函数不能声明为虚函数,析构函数可以

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数.不建议在构造函数和析构函数里面调用虚函数. 构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的.而在构造一个对象时,由于对象还未构造成功.编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类.无法确定... 2 虚函数的执行依赖于虚函数表.而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数

c++析构函数为什么要为虚函数

注:本文内容来源于zhice163博文,感谢作者的整理. 1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生. 下面转自网络:源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html a.第一段代码 #include<iostream> using namespace std; class ClxBase{ public: ClxBase() {}; ~ClxBase()