zoukankan      html  css  js  c++  java
  • 虚析构函数

    #include <iostream>
    #include <cstdio>
    #include <string>
    using namespace std;
    
    class Base{
    public:
        virtual ~Base(){
            cout<<"Base deconstruct func"<<endl;
        }
    };
    
    class Derive: public Base{
    public:
        ~Derive(){
            cout<<"Derive deconstruct func"<<endl;
        }
    };
    
    int main()
    {
        Derive *p = new Derive();
        delete p;
        //使用派生类指针指向派生类,会自动调用基类析构函数
        
        Base *p1 = new Derive();
        delete p1;
        //使用基类指针指向派生类,只有当基类析构函数定位为虚函数的时候,才会自动调用派生类析构函数,然后在调用基类的析构函数 与虚函数表有关
    
        system("pause");
        return 0;
    }

      当然不一定要把所有的析构函数都设置成虚函数,因为会增加空间消耗。

      真相大白:delete p1时,p1类型Base类中包含虚析构函数,所以p1实际指向的是派生类Derive对象,Derive继承了Base,派生类中包含虚表,通过vptr -> vtable[0]->Derive的析构函数->Derive子类进而调用父类Base的析构函数。

      继承关系中,析构从子类开始之后自动调用父类的因此关键是要找到 子类的析构函数。 Base 指针指向了 derive中 Base object 区域,如果 Base 析构virtual的话,那么会绑定到子类的析构函数。

  • 相关阅读:
    sql事务
    连续按两次提示退出功能
    页面跳转及传值
    TextView详解
    textAppearance的属性设置
    POJ-1459 Power Network
    POJ-2112 Optimal Milking
    POJ-1149 PIGS
    AOJ-722 发红包
    HDU-3605 Escape
  • 原文地址:https://www.cnblogs.com/luntai/p/6061069.html
Copyright © 2011-2022 走看看