【C++】父类参数有默认值时子类构造函数列表中可以省略该参数

在 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

通过这种方式,你可以在派生类的构造函数中省略具有默认值的参数,并且可以显式地传递其他必需的参数。这提供了灵活性并简化了构造函数的调用。

相关推荐
郝学胜_神的一滴1 天前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天2 天前
C++ 基础入门完全指南
c++
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK4 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境4 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境4 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴5 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境7 天前
C++ 的Eigen 库全解析
c++
卷无止境7 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴7 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake