子类通过初始化列表调用父类构造函数,若父类无默认构造函数则必须显式调用,否则编译器自动调用默认构造函数,多重继承时按继承顺序依次调用各父类构造函数。

在C++继承中,子类无法直接“调用”父类的构造函数,但可以在子类构造函数的初始化列表中显式指定调用父类的某个构造函数。如果未显式指定,编译器会自动尝试调用父类的默认构造函数(无参构造函数)。
1. 使用初始化列表调用父类构造函数
在子类构造函数中,通过初始化列表来调用父类的构造函数是最常见的方式。
#includeusing namespace std; class Parent { public: Parent(int x) { cout << "Parent constructor with x = " << x << endl; } }; class Child : public Parent { public: Child() : Parent(10) { // 显式调用父类构造函数 cout << "Child constructor" << endl; } };
在这个例子中,Child() 构造函数通过 : Parent(10) 调用了父类带一个参数的构造函数。
2. 父类有默认构造函数时可省略
如果父类有默认构造函数(无参或所有参数都有默认值),子类可以不显式调用:
立即学习“C++免费学习笔记(深入)”;
class Parent {
public:
Parent() {
cout << "Default Parent constructor" << endl;
}
};
class Child : public Parent {
public:
Child() { // 编译器自动调用 Parent()
cout << "Child constructor" << endl;
}
};
3. 多重继承中的调用方式
在多重继承中,子类需在初始化列表中分别调用每个父类的构造函数:
class A {
public:
A(int a) { cout << "A: " << a << endl; }
};
class B {
public:
B(int b) { cout << "B: " << b << endl; }
};
class C : public A, public B {
public:
C() : A(1), B(2) { // 按继承顺序调用
cout << "C constructor" << endl;
}
};
4. 注意事项
- 父类构造函数总是在子类构造函数体执行之前被调用。
- 不能在子类构造函数体内调用父类构造函数(如 Parent(5); 是创建临时对象,不是调用构造函数)。
- 若父类没有默认构造函数,且子类未在初始化列表中调用,则编译报错。
- 构造函数调用顺序:先调用父类,再调用成员对象,最后执行子类构造函数体。
基本上就这些。关键点是使用初始化列表显式调用父类构造函数,尤其是在父类没有默认构造函数时必须这样做。











