在继承机制中,派生类的构造函数需要负责完成两个方面的工作:
- 自身成员的初始化: 构造函数负责初始化派生类自己的成员变量。
- 基类构造函数的调用: 构造函数要调用基类的构造函数,确保基类的成员得到正确的初始化。
构造函数的写法与普通的成员函数类似,但有一些特殊的注意事项。以下是一些示例:
1. 默认构造函数:
class Base {
public:
Base() {
// 基类构造函数的初始化工作
}
};
class Derived : public Base {
public:
Derived() : Base() {
// 派生类自身的初始化工作
}
};
2. 带参数的构造函数:
class Base {
public:
Base(int value) {
// 基类构造函数的初始化工作,使用传入的参数 value
}
};
class Derived : public Base {
public:
Derived(int value1, int value2) : Base(value1) {
// 派生类自身的初始化工作,使用传入的参数 value2
}
};
3. 使用成员初始化列表:
在构造函数中使用成员初始化列表,可以更加简洁地初始化基类和派生类的成员:
class Base {
public:
Base(int value) {
// 基类构造函数的初始化工作
}
};
class Derived : public Base {
public:
Derived(int value1, int value2) : Base(value1), derivedMember(value2) {
// 派生类自身的初始化工作
}
private:
int derivedMember;
};
在上述示例中,Derived
类使用了成员初始化列表,通过逗号分隔调用基类构造函数和派生类成员的构造函数。这种方式可以提高代码的效率,并且在某些情况下更有必要,特别是当成员是对象而不仅仅是基本数据类型时。
例题
- 【问题描述】
设计一个车类(Vehicle),数据成员有轮子个数(num)、车重(weight)。巴士类(Bus)是车类的私有派生类,包含载客数(pnum)。轿车类(Car)是巴士类的受保护派生类,包含载客重量(pweight)。每个类都有数据的输出方法。编写程序,通过轿车类对象输出轿车的轮子个数、车重、载客数和载客重量。 - 【输入形式】
依次输入轿车的轮子个数、车重、载客数和载客重量。 - 【样例输入】
4 100 6 980
- 【样例输出】
****轿车信息****
--------------------
车轮数: 4
车重量: 100
载客量: 6
载重量: 980
--------------------
- 【说明】
【样例输出】的每行数据后面没有空行。 - 【AC代码】
#include <iostream>
using namespace std;
class Vehicle {
int num;
float weight;
public:
Vehicle(int n, float w) : num(n), weight(w) {}
void Print_v() {
cout << "车轮数: " << num << endl << "车重量: " << weight << endl;
}
};
class Bus : private Vehicle {
int pnum;
public:
Bus(int n, float w, int p) : Vehicle(n, w), pnum(p) {}
void Print_p() {
Print_v();
cout << "载客量: " << pnum << endl;
}
};
class Car : protected Bus {
float pweight;
public:
Car(int n, float w, int p, float pw) : Bus(n, w, p), pweight(pw) {}
void Show() {
cout << "--------------------" << endl;
Print_p();
cout << "载重量: " << pweight << endl;
cout << "--------------------" << endl;
}
};
int main() {
int num, weight, pnum, pweight;
cin >> num >> weight >> pnum >> pweight;
Car t(num, weight, pnum, pweight);
cout << "****轿车信息****" << endl;
t.Show();
return 0;
}