如果父类的构造函数没有默认参数,子类如何正确调用父类构造函数?
时间: 2025-07-19 13:54:03 浏览: 3
如果父类的构造函数没有默认参数,子类必须显式调用父类的构造函数,并传递所需的参数。这是因为如果没有默认构造函数,编译器无法隐式调用父类的构造函数。
### 示例代码
以下是一个示例,展示了当父类构造函数没有默认参数时,子类如何正确调用父类构造函数:
```cpp
#include <iostream>
using namespace std;
// 父类
class Base {
protected:
int baseValue;
public:
// 没有默认构造函数,只有带参数的构造函数
Base(int value) : baseValue(value) {
cout << "Base constructor called with value: " << baseValue << endl;
}
};
// 子类
class Derived : public Base {
private:
int derivedValue;
public:
// 子类构造函数,必须显式调用父类构造函数
Derived(int baseVal, int derivedVal) : Base(baseVal), derivedValue(derivedVal) {
cout << "Derived parameterized constructor called with value: " << derivedValue << endl;
}
};
int main() {
// 创建子类对象时,必须为父类构造函数提供参数
Derived obj(10, 20); // 显式传递参数给父类构造函数
return 0;
}
```
### 输出结果:
```
Base constructor called with value: 10
Derived parameterized constructor called with value: 20
```
### 上述代码解释:
1. **父类 `Base`**:
- 提供了一个带参数的构造函数 `Base(int value)`,没有默认构造函数。
- 如果创建 `Base` 对象时未提供参数,则会导致编译错误。
2. **子类 `Derived`**:
- 包含一个带参数的构造函数 `Derived(int baseVal, int derivedVal)`。
- 在构造函数的初始化列表中,显式调用了父类的构造函数 `Base(baseVal)`,并传递了参数 `baseVal`。
3. **主函数 `main()`**:
- 创建了一个 `Derived` 类的对象 `obj`,并传递了两个参数 `10` 和 `20`。
- 参数 `10` 被传递给父类构造函数,参数 `20` 被传递给子类构造函数。
---
### 注意事项
- 如果父类没有无参构造函数(即没有默认构造函数),则子类必须在每个构造函数中显式调用父类的构造函数。
- 子类无法直接访问父类的私有成员,但可以通过父类的构造函数初始化这些成员。
---
阅读全文
相关推荐


















