生成一个派生类对象时,调用基类和派生类构造函数按啥次序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成一个派生类对象时,调用基类和派生类构造函数按啥次序相关的知识,希望对你有一定的参考价值。

生成一个派生类对象时,调用基类和派生类构造函数按什么次序

当派生类对象生成的时候会调用构造函数,首先调用基类的构造函数生成基类部分,然后调用自己的构造函数,析构的时候顺序正好相反,先析构自身的然后析构释放派生类的。。。 参考技术A 是的。派生类是对基类的一个继承,所谓继承,也就是说派生类在理论上要包括所有的基类功能,C++通过调用基类的构造函数来解决这个问题。

构造函数的功能是初始化类对象,当你创建一个派生类对象的时候,派生类会自动调用基类的构造函数来初始化对象,然后再调用派生类的构造函数,这样就可以保证你所创建的派生类对象被完整的初始化。
参考技术B 继承机制,创建派生类对象,首先创建基类对象。 而创建派生类对象时,将首先调用派生类构造函数,之后再调用基类构造函数,这与继承机制的顺序不同。另外,类构造函数不能是虚函数 参考技术C 派生类构造函数执行顺序如下所述。

. 调用基类构造函数;

. 调用子对象的构造函数;

. 派生类的构造函数体;
您还可以参考一下这个网址:http://blog.chinaunix.net/u3/94667/showart_2225875.html

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++岗位的面试题

以上是关于生成一个派生类对象时,调用基类和派生类构造函数按啥次序的主要内容,如果未能解决你的问题,请参考以下文章

关于C++基类与派生类

C++中派生类的构造函数怎么显式调用基类构造函数?

类学习

基类和派生类构造函数的内存分配

C++如何使用派生类构造函数销毁基类中的对象

C++基类和派生类的构造函数