请问含有多个对象成员的派生类的构造函数执行时不是先执行基类么?为啥这个先输出的是“正式生是”这个
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问含有多个对象成员的派生类的构造函数执行时不是先执行基类么?为啥这个先输出的是“正式生是”这个相关的知识,希望对你有一定的参考价值。
参考技术A 看不清楚呀亲C++入门派生类和基类的构造/析构函数关系
1、派生类和基类的构造/析构函数关系
(1)派生类不继承基类的构造和析构函数,只继承成员变量和普通的成员函数;
(2)派生类有自己的构造/析构函数,意思是创建派生类对象时,调用的都是派生类自己的对象;
(3)虽然派生类不继承基类的构造/析构函数,但是在创建/销毁派生类对象时,是会调用基类的构造/析构函数的;
2、为什么派生类不继承却要调用基类的构造/析构函数?
(1)构造函数的作用:初始化成员变量,分配动态内存;析构函数的作用:释放构造函数申请的动态内存;
(2)派生类虽然继承了基类的成员变量和成员函数,但是并不清楚应该怎么去初始化,也不应该让派生类去考虑初始化基类,否则还不如自己写,何必去继承;
(3)合理的做法是:派生类继承自基类的成员变量和函数调用基类的构造函数去初始化,派生类自己特有的成员变量和函数由派生类自己的构造函数去初始化;析构函数也是一样;
总结:派生类不继承基类的构造/析构函数,但是会调用基类的构造/析构函数;
3、示例代码
#include <iostream>
#include <string>
using namespace std;
//person类表示所有人共有的特性
class person
public:
int gender; //性别,0代表男,1代表女
//构造函数
person()cout << "person()" << endl;
person(string myName, int myGender, int myAge):name(myName),gender(myGender),age(myAge) cout << "person(string myName, int myGender, int myAge)" << endl;
//析构函数
~person()cout << "~person()" << endl;;
private:
string name;
protected:
int age;
;
//adult类表示成年人
class adult:public person
public:
//构造函数
adult()cout << "adult()" << endl;;
adult(string myname, int myGender, int myAge):person(myname, myGender, myAge)cout << "adult(string myName, int myGender, int myAge)" << endl;
~adult()cout << "~adult()" << endl;;
private:
protected:
;
int main(void)
adult ad("linux", 1 , 23);
cout << "ad.gender=" << ad.gender << endl;
return 0;
4、代码结果分析
root@ubuntu:# ./app
person(string myName, int myGender, int myAge)
adult(string myName, int myGender, int myAge)
ad.gender=1
~adult()
~person()
(1)person是基类,adult是父类;
(2)先调用基类的构造函数,后调用派生类的构造函数;
(3)先调用派生类的析构函数,后调用基类的析构与函数;
(4)总结:构造/析构函数的调用,符合"栈"结构的调用;
推荐
我会在C++专栏持续根据更新C++相关的知识点,这里也给大家推荐一款学习C++的神器,我也是在用这一款神器在学习C++。
链接:学习神器跳转
如果你是想入门C++这门语言或者是找C++岗位的工作,都推荐你试试这个网站,里面有针对C++知识点的选择题、编程题,更有C++岗位的面试题
以上是关于请问含有多个对象成员的派生类的构造函数执行时不是先执行基类么?为啥这个先输出的是“正式生是”这个的主要内容,如果未能解决你的问题,请参考以下文章