在 C++ 中,如果你在基类的构造函数中为某个中间参数提供了默认值,并且你想在派生类的构造函数中调用这个基类的构造函数时使用该默认值,你可以省略显式传递该参数。你只需要确保其他必需的参数正确传递即可。
假设基类 Base
的构造函数定义如下:
cpp
class Base : public QObject {
Q_OBJECT
public:
int value1;
int value2; // 提供默认值 50
int value3;
Base(int val1, int val2 = 50, int val3) : value1(val1), value2(val2), value3(val3) {
qDebug() << "Base constructor with values:" << value1 << value2 << value3;
}
virtual ~Base() {}
};
在派生类 Derived
中,你可以省略传递默认值的参数,并让编译器使用基类构造函数中的默认值:
示例代码
cpp
class Derived : public Base {
Q_OBJECT
public:
// 子类构造函数只传递第一个和第三个参数,并利用基类的默认值
explicit Derived(int val1, int val3) : Base(val1, val3) {
qDebug() << "Derived constructor with values:" << value1 << value2;
}
virtual ~Derived() {}
};
解释
-
基类
Base
:- 构造函数定义为
Base(int val1, int val2 = 50, int val3)
,其中第二个参数val2
提供了默认值50
。
- 构造函数定义为
-
子类
Derived
:- 子类构造函数只传递第一个和第三个参数,并在调用基类构造函数时省略中间的参数,默认使用
50
。
- 子类构造函数只传递第一个和第三个参数,并在调用基类构造函数时省略中间的参数,默认使用
使用示例
cpp
#include <QCoreApplication>
#include "base.h"
#include "derived.h"
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
Derived derivedInstance(10, 30); // 只传递第一个和第三个参数
qDebug() << "Derived instance values:" << derivedInstance.value1 << derivedInstance.value2 << derivedInstance.value3;
return app.exec();
}
输出结果
cpp
Base constructor with values: 10 50 30
Derived constructor with values: 10 50
Derived instance values: 10 50 30
总结
- 基类构造函数 :定义为
Base(int val1, int val2 = 50, int val3)
,其中第二个参数提供了默认值。 - 子类构造函数 :只传递第一个和第三个参数,并在调用基类构造函数时省略中间的参数,默认使用
50
。
通过这种方式,你可以在派生类的构造函数中省略具有默认值的参数,并且可以显式地传递其他必需的参数。这提供了灵活性并简化了构造函数的调用。