继承构造函数是 C++11 引入的一个重要特性,它允许派生类直接复用基类的构造函数,而无需手动编写一一对应的转发代码。
在没有这个特性之前(C++98/03),如果基类有多个构造函数,派生类必须为每一个构造函数都写一遍形参列表并显式调用基类构造函数,代码非常冗余且难以维护。
核心语法:在派生类中使用 using 基类名::基类名;。
核心工作原理
当你写下 using Base::Base; 时,编译器会为派生类自动生成与基类各构造函数形参列表相同的派生类构造函数(除了默认构造、拷贝构造和移动构造会被特殊处理外)。这些自动生成的构造函数会直接将参数转发给基类对应的构造函数。
⚠️ 重要注意事项(易错点)
继承构造函数不会初始化派生类新增的成员变量。如果你在派生类中添加了新的成员变量,必须给它们提供类内默认初始化器(C++11 起支持),否则这些新增成员将处于未初始化状态
#include <iostream>
#include <string>
// 基类
class Student {
public:
// 构造函数1:只传姓名
Student(const std::string& n) : name(n) {
std::cout << "Student(name) called" << std::endl;
}
// 构造函数2:传姓名和年龄
Student(const std::string& n, int a) : name(n), age(a) {
std::cout << "Student(name, age) called" << std::endl;
}
// 构造函数3:传姓名、年龄和分数
Student(const std::string& n, int a, double s) : name(n), age(a), score(s) {
std::cout << "Student(name, age, score) called" << std::endl;
}
void info() const {
std::cout << "Name: " << name << ", Age: " << age << ", Score: " << score << std::endl;
}
private:
std::string name;
int age = 0;
double score = 0.0;
};
// 派生类 (本科生)
class Undergraduate : public Student {
public:
// ★ 核心语句:继承基类的所有构造函数
using Student::Student;
// 新增的成员变量,必须给予默认初始化,因为继承来的构造函数不会初始化它
std::string major = "Undeclared";
// 为了展示新成员,重写info
void info() const {
Student::info();
std::cout << "Major: " << major << std::endl;
}
};
int main() {
// 调用继承自基类的 Student(const std::string&) 构造函数
Undergraduate u1("Alice");
u1.info();
std::cout << "——————" << std::endl;
// 调用继承自基类的 Student(const std::string&, int, double) 构造函数
Undergraduate u2("Bob", 20, 95.5);
u2.info(); // 注意:major 依然是 "Undeclared"
return 0;
}


