7.2 派生类的构造和析构函数

目录

1、派生类构造函数的定义

2、派生类构造函数的执行顺序

3、派生类构造函数示例

4、运行结果

5、派生类的析构函数

6、继承VS组合


1、派生类构造函数的定义

1.派生类继承了基类的数据成员

2.派生类构造函数的形参表不但要包含对派生数据成员初始化的参数,还要包含对基类数据成员初始化的参数

3.派生类构造函数要明确指出分配给基类的参数

派生类名::派生类名(基类所需的形参, 本类新成员所需的形参):基类名1(参数表1),基类名2(参数表2)......
{
    本类新成员初始化赋值语句;
}

注意:

1.基类数据成员的初始化有基类的构造函数完成

2.当基类有多个构造函数时,系统会根据参数传递列表自动完成基类构造函数的重载,调用最匹配的基类构造函数初始化继承来的基类成员;若参数表为空,则调用类的无参构造函数(在基类中自定义了构造函数则没有默认构造函数)

2、派生类构造函数的执行顺序

 3、派生类构造函数示例

/*由基类: MP3、SD类, 派生出派生类: MP4类*/
#include <iostream>
using namespace std;
class MP3
{
protected:
	int mode;  //0:顺序播放, 1:随机播放
public:
	MP3(int m = 0)
	{
		mode = m;
		cout << "基类MP3的构造函数被调用" << endl;
	}
	void Display()
	{
		cout << "MP3:" << mode << endl;
	}
};

class SD
{
private:
	double size;  //内存容量
public:
	SD(double s = 8000)
	{
		size = s;
		cout << "基类SD的构造函数被调用" << endl;
	}
	int getSize()
	{
		return size;
	}
};

class MP4 :public MP3, public SD
{
private:
	int type;  //O:播放视频, 1:播放音频
public:
	MP4(double s, int m, int t) :MP3(m), SD(s)
	{
		type = t;
		cout << "派生类MP4的3参构造函数被调用" << endl;
	}
	MP4(int t = 0)
	{
		type = t;
		cout << "派生类的默认构造函数被调用" << endl;
	}
	void Display()
	{
		cout << "MP4(优先文件类型|默认播放模式):" << type << '|' << mode << endl;
		cout << "可用容量:" << getSize() << endl;
	}

};
int main()
{
	MP4 first_mp4;
	first_mp4.Display();  //无参构造
	cout << endl;
	MP4 second_mp4(4000, 1, 1);  三参构造
	second_mp4.Display();

}

4、运行结果

5、派生类的析构函数

在派生过程中,派生类的析构函数也不能继承下来。

派生类析构函数声明方法与没有继承关系的类中的析构函数的声明方法完全相同,只要在函数体中负责把派生类新增的非对象成员的清理工作做好就够了,系统会自己调用基类及对象成员的析构函数来对基类及对象成员进行清理。

但它的执行次序和构造函数恰好完全相反

 6、继承VS组合

  1. 继承和组合都能构建更复杂的类,是实现代码复用的方法
  2. 从获得其他类的成员的角度来思考,继承和组合在结果上是相似的,但在副本的数量上是有区别的
  3. 组合是将已有的对象拼合为新对象,是简单的代码复用。新类中可以重复含有已有类的对象,从而多次获得已有类的成员
  4. 继承是创建一个新类,将其视作现有类的一个 ‘子类型’ ,所以只能获得1次原有类的成员
  5. 组合比继承更具灵活性和稳定性,在设计时优先使用组合

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是程序的实现(注释中有详细的说明): ```c++ #include <iostream> #include <string> using namespace std; class Mammal { public: string color; // 颜色 double weight; // 体重 static int count; // 静态数据成员,记录对象总数 Mammal(string c, double w) : color(c), weight(w) { // 构造函数 count++; // 对象总数+1 } virtual ~Mammal() { // 析构函数 count--; // 对象总数-1 } virtual void print() { // 虚函数,输出颜色和体重 cout << "Color: " << color << ", Weight: " << weight << endl; } }; class Dog : public Mammal { public: string breed; // 犬种 Dog(string c, double w, string b) : Mammal(c, w), breed(b) {} // 构造函数 ~Dog() {} // 析构函数 void print() { // 输出狗的信息 cout << "This is a " << breed << " dog. "; Mammal::print(); // 调用基类的print函数 } }; class Cat : public Mammal { public: bool isStray; // 是否流浪猫 Cat(string c, double w, bool s) : Mammal(c, w), isStray(s) {} // 构造函数 ~Cat() {} // 析构函数 void print() { // 输出猫的信息 if (isStray) { cout << "This is a stray cat. "; } else { cout << "This is not a stray cat. "; } Mammal::print(); // 调用基类的print函数 } }; int Mammal::count = 0; // 静态数据成员初始化 int main() { Mammal m1("brown", 10.5), m2("white", 7.2); // 定义两个Mammal对象 Dog d1("black", 15.3, "Labrador"), d2("golden", 12.6, "Golden Retriever"); // 定义两个Dog对象 Cat c1("gray", 4.5, true), c2("orange", 5.2, false); // 定义两个Cat对象 Mammal* pm1 = new Mammal("yellow", 8.1); // 动态申请一个Mammal对象 Dog* pd1 = new Dog("gray", 18.9, "Husky"); // 动态申请一个Dog对象 Cat* pc1 = new Cat("black", 3.7, true); // 动态申请一个Cat对象 cout << "Mammal count: " << Mammal::count << endl; // 输出Mammal对象总数 cout << "Dog count: " << Dog::count << endl; // 输出Dog对象总数 cout << "Cat count: " << Cat::count << endl; // 输出Cat对象总数 m1.print(); // 输出颜色和体重 d1.print(); // 输出狗的信息和颜色、体重 c1.print(); // 输出猫的信息和颜色、体重 delete pm1; // 释放动态申请的Mammal对象 delete pd1; // 释放动态申请的Dog对象 delete pc1; // 释放动态申请的Cat对象 cout << "Mammal count: " << Mammal::count << endl; // 再次输出Mammal对象总数 cout << "Dog count: " << Dog::count << endl; // 再次输出Dog对象总数 cout << "Cat count: " << Cat::count << endl; // 再次输出Cat对象总数 cout << "Main function ends." << endl; return 0; } ``` 程序输出结果: ``` Mammal count: 7 Dog count: 2 Cat count: 2 Color: brown, Weight: 10.5 This is a Labrador dog. Color: black, Weight: 15.3 This is a stray cat. Color: gray, Weight: 4.5 Mammal count: 4 Dog count: 0 Cat count: 0 Main function ends. ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值