【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)总结:构造/析构函数的调用,符合""结构的调用;

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值