C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

基类和派生类:构造函数和析构函数的执行顺序

在Visual Studio中,新建控制台工程,构造类以下:ios

#include<iostream>
using namespace std;

class CBase {
public:
    CBase() {
        cout << "CBase():Constructor" << endl;
    }
    ~CBase() {
        cout << "CBase(): Destructor" << endl;
    }
};

class CDerive :public CBase {
public:
    CDerive() {
        cout << "CDerive():Constructor" << endl;
    }
    ~CDerive() {
        cout << "CDerive(): Destructor" << endl;
    }
};

对应不一样的指针进行 delete 操做,结果以下:函数

(i)spa

int main(int argc, char* argv[])
{
    CBase* p = new CDerive();
    delete p;
    return 0;
}

运行结果:指针

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CBase(): Destructor

(ii)code

int main(int argc, char* argv[])
{
    CDerive* pp = new CDerive();
    delete pp;
    return 0;
}

运行结果:编译器

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CDerive(): Destructor
CBase(): Destructor

(iii)io

int main(int argc, char* argv[])
{
    CDerive* pp = new CDerive();
    CBase * p = (CBase*)pp;
    delete p;
    return 0;
}

运行结果:编译

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CBase(): Destructor

(iv)class

int main(int argc, char* argv[])
{
    CBase * p = new CDerive();
    CDerive * pp = (CDerive*)p;
    delete pp;
    return 0;
}

运行结果:stream

S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor
CDerive():Constructor
CDerive(): Destructor
CBase(): Destructor

总结: 由上面的实验结果能够看出,当 new CDerive() 时,会先运行基类的构造函数,而后再运行派生类的构造函数; 而当 delete pointer 时,编译器只考虑 pointer 指针自己的类型而不关心 pointer 实际指向的类型,即:若 pointer 为基类指针,则只调用基类的析构函数(无论 pointer 实际指向的是基类仍是派生类);若 pointer 是派生类指针,则先调用派生类的析构函数,再调用基类的析构函数,调用顺序与调用构造函数的顺序相反。

相关文章
相关标签/搜索