C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
2016-09-12 12:00
579 查看
基类和派生类:构造函数和析构函数的执行顺序
在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:\ComputerTech\VS2015\Release>Test.exe CBase():Constructor CDerive():Constructor CBase(): Destructor
(ii)
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)
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)
int main(int argc, char* argv[]) { CBase * p = new CDerive(); CDerive * pp = (CDerive*)p; delete pp; return 0; }
运行结果:
S:\ComputerTech\VS2015\Release>Test.exe CBase():Constructor CDerive():Constructor CDerive(): Destructor CBase(): Destructor
总结:
由上面的实验结果可以看出,当 new CDerive() 时,会先运行基类的构造函数,然后再运行派生类的构造函数;
而当 delete pointer 时,编译器只考虑 pointer 指针本身的类型而不关心 pointer 实际指向的类型,即:若 pointer 为基类指针,则只调用基类的析构函数(不管 pointer 实际指向的是基类还是派生类);若 pointer 是派生类指针,则先调用派生类的析构函数,再调用基类的析构函数,调用顺序与调用构造函数的顺序相反。
相关文章推荐
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
- c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)
- C++学习笔记(4)——派生类的构造函数和析构函数
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- 基类和派生类的构造函数和析构函数执行顺序
- C++中基类,派生类 类成员对象的构造函数,析构函数的顺序
- c++学习笔记4,调用派生类的顺序构造和析构函数(一个)
- 总结笔记-c++成员变量、构造函数以及析构函数的执行顺序
- C++学习笔记(调用构造函数和析构函数的顺序)
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- C++基类、派生类构造函数调用顺序
- 【菜鸟C++学习笔记】12.构造函数与析构函数
- 派生类构造函数和析构函数的执行顺序
- 构造函数和析构函数在基类和派生类之间的调用顺序
- 浅出C++对象模型——理解构造函数、析构函数执行顺序
- C#中基类和派生类的构造函数以及变量的执行顺序整理
- 宋体、构造函数-浅出C++对象模型——理解构造函数、析构函数执行顺序-by小雨
- C++学习笔记1:构造函数和析构函数