C++入门派生类和基类的构造/析构函数关系

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++基类与派生类

虚函数和基类中的this指针的问题!

继承类和基类的构造函数

派生类和基类的转换

Effective C++ 6.继承与面向对象设计