C++ 多重继承,虚析构确定

来个例子就明了了:

#include<iostream>
using namespace std;
class Base1
{
public:
    virtual ~Base1(){
        cout<<"Base1"<<endl;
    }
};
class Base2
{
public:
    virtual ~Base2(){
        cout<<"Base2"<<endl;
    }
};
class D1:public Base1{
public:
    ~D1()
    {
        cout<<"D1"<<endl;
    }
};
class D2:public Base2{
public:
    ~D2()
    {
        cout<<"D2"<<endl;
    }
};
class MI:public D1,public D2{
public:
    ~MI()
    {
        cout<<"MI"<<endl;
    }
};
int main(int argc, char *argv[])
{
    Base1 *pb1=new MI;
    Base2 *pb2=new MI;
    D1 *pd1=new MI;
    D2 *pd2=new MI;
    delete pb2;
    cout<<endl;
    delete pd1;
    cout<<endl;
    delete pd2;
    cout<<endl;
    return 0;
}

特别关注delete pd2;

实质上它的结果和pd1的释放是一模一样的,虽然pd2是D2类型指针,但是析构会整个析构MI对象,这个对象包含了Base1子对象,D1子对象,Base2子对象,D2子对象,还有自身的部分。所有的过程为逆序析构,打印结果为:

时间: 2024-08-13 17:55:02

C++ 多重继承,虚析构确定的相关文章

[转载]析构函数的虚析构和非虚析构调用的差别

代码示例: 非虚析构的情况下. #include <stdio.h> #include <iostream> using namespace std; class A { public: A() { std::cout << "A is created." << std::endl; } ~A() { std::cout << "A is deleted." << std::endl; } };

类的析构及虚析构探究

正常析构及析构在多继承基类中产生的不足 #include <iostream> using namespace std; ////////////////////////////////////////////////////////////////////////// // 正常析构解决不了父类new子类时析构函数调用的问题 // 也就是构造函数被调用了四次,而析构函数却被调用了三次 // // 正常析构不能解决父子类同台出现的某些极端情况 /* class A class B class

不可或缺 Windows Native (22) - C++: 多重继承, 虚基类

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1.基类 1CppBase1.h #pragma once #include <string> #include "CppBaseVirtual.h" using namespace std; namespace NativeDll { // virtual 代表 CppBaseVirtual 是 CppBase1 的虚基类(虚基类是在声明派生类时,指定继承方式

C++——虚析构

目的: //只执行了 父类的析构函数//向通过父类指针 把 所有的子类对象的析构函数 都执行一遍//向通过父类指针 释放所有的子类资源 方法:在父类的析构函数前+virtual关键字 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //虚析构函数 class A { public: A() { p = new char[20]; strcpy(p, "obja"); print

虚析构和纯虚析构

虚析构和纯虚析构的共性 1.可以解决父类指针释放子类对象 2.都需要具体的函数实现 虚析构和纯虚析构的区别 如果是纯虚析构,则该类属于抽象类,无法实例化对象 虚析构语法 virtual ~类名(){} 纯虚析构 virtual ~类名() = 0 纯虚析构的类外实现 类名::~类名(){} 1 #include<bits/stdc++.h> 2 #include<iostream> 3 using namespace std; 4 5 class Animal 6 { 7 publ

虚析构基类函数

考虑以下代码 class Ref { public: virtual ~Ref() { cout << "~Ref()" << endl; } }; class People :public Ref { public: ~People() { cout << "~People()" << endl; } }; 以下代码输出什么? int main(int argc, char *argv[]) { { People h

C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类.子类中的同名函数的话,这个函数是有要求的: 在父类中,eat函数声明之前必须要加virtual声明eat()函数为虚函数. 一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是虚函数. 为了避免你在子类中写错虚函数,在C++11中,你可以在函数

c/c++: c++继承 内存分布 虚表 虚指针 (转)

http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base { public:  int m_base; }; class DerivedA: public Base { public:  int m_derivedA; }; class DerivedB: public Base { public:  int m_derivedB; }; class DerivedC

C++内存分布 虚表 虚指针(非常重要)

C++内存分布 虚表 虚指针: class Base { public: int m_base; }; class DerivedA: public Base { public: int m_derivedA; }; class DerivedB: public Base { public: int m_derivedB; }; class DerivedC: public DerivedA, public DerivedB { public: int m_derivedC; }; 类结构图: