zoukankan      html  css  js  c++  java
  • C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

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

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

    #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)

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

    运行结果:

    S:ComputerTechVS2015Release>Test.exe
    CBase():Constructor
    CDerive():Constructor
    CBase(): Destructor
    

    (ii)

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

    运行结果:

    S:ComputerTechVS2015Release>Test.exe
    CBase():Constructor
    CDerive():Constructor
    CDerive(): Destructor
    CBase(): Destructor
    

    (iii)

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

    运行结果:

    S:ComputerTechVS2015Release>Test.exe
    CBase():Constructor
    CDerive():Constructor
    CBase(): Destructor
    

    (iv)

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

    运行结果:

    S:ComputerTechVS2015Release>Test.exe
    CBase():Constructor
    CDerive():Constructor
    CDerive(): Destructor
    CBase(): Destructor
    

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

  • 相关阅读:
    Yii2的深入学习--行为Behavior
    使用WordPress搭建自己的博客
    php-resque的设计和使用
    PHP的学习--在Atom中使用XDebug(Mac)
    七牛镜像的使用
    macOS平台下虚拟摄像头的研发总结
    macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号
    XCode日常使用备忘录
    DirectShow Filter的开发实践
    Windows下程序启动时出现0xc000007b错误的解决方案
  • 原文地址:https://www.cnblogs.com/dongling/p/5864295.html
Copyright © 2011-2022 走看看