c++派生类的构造函数和析构函数调用顺序
//program 14.4.1.cpp 派生类的构造函数和析构函数调用顺序 #include <iostream> #include <string> using namespace std; class CBug { int legNum,color; int No ; public: /*利用初始化列表来指定基类的构造函数;以及为派生类的某些成员变量做初始化 定义了有参constructor后,编译器不在生成默认无参constructor了;那么如果此时欲调用无参构造函数就会出错!!!*/ CBug (int ln, int cl,int No_):legNum/*有默认值的参数必须集中靠某一侧,不能够出现在中间,这个调整一下,(注意传参时的顺序即可)*/(ln),color(cl),No(No_) { /*由于初始化列表中已经成员变量指定了初始化值,所以析构函数内部就不需要再次特地编写初始化成员变量的语句*/ cout << "CBug Constructor" <<endl; }; ~CBug() { cout << "CBug Destructor" ; cout << ":" << No<<endl; } void PrintInfo() { cout << legNum << "," << color <<endl; } }; class CFlyingBug: public CBug { int wingNum; public: /*利用初始化列表来指定基类的构造函数;以及为派生类的某些成员变量做初始化*/ // CFlyingBug( ) { } 若不注释掉则会编译出错;因为定义了有参constructor后,编译器不在生成默认无参constructor了;那么如果此时欲调用无参构造函数就会出错! CFlyingBug ( int ln, int cl,int No_, int wn):CBug(ln,cl,No_),wingNum(wn) { cout << "CFlyingBug Constructor" <<endl; } ~CFlyingBug() { cout << "CFlyingBug Destructor" << endl; cout << "\t"; } }; int main() { CBug bug1(1,2,1); CFlyingBug fb(2,3,2,4);//执行constructor(先执行基类CBug的constructor,然后执行派生类CFlyingBug的constructor CBug bug2(3,4,3); fb.PrintInfo (); return 0; /*执行destructor(对于一个派生类的消亡, 先执行派生类CFlyingBug的destructor,再执行基类CBug的destructor)*/ /*但是如果在程序中同时存在派生类对象和基类对象,那么哪个对象先消亡要取决于定义顺序,后定义的先消亡(每个种类型的对象又尤其自己的destructor调用路线; * 基类的所有成员(包括私有成员,但私有成员是无法被(只属于)派生类的方法所访问到,还是需要基类有对应的方法才能够间接访问而且基类的方法得是公开的才可.)自动成为派生类的成员。*/ } ```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-05-09 7zip@命令行压缩@解压缩7z/zip/等各种压缩格式包@查看压缩包内容
2021-05-09 android Development_资源文件.xml(资源引用中的@/?号)
2021-05-09 kotlin_object关键字的语言现象
2021-05-09 viewModel简单应用_保存数据,以供屏幕旋转创建新的Activity/Fragment时取得旋转前的数据(计数器为例)