继承类的默认构造函数是指在派生类中没有显式定义构造函数时,编译器自动生成的构造函数。这个构造函数会自动调用基类的构造函数来初始化基类部分。
= default
显式声明原因:派生类的默认构造函数试图调用基类的默认构造函数,但基类没有
解决方案:
class Base {
public:
Base(int x) {} // 只有带参数的构造函数
};
class Derived : public Base {
public:
// 必须显式调用基类构造函数
Derived() : Base(0) {} // 提供默认值
Derived(int x) : Base(x) {} // 或传递参数
};
原因:默认构造函数可能无法满足成员变量的初始化需求
解决方案:
class MyClass {
std::vector<int> data;
public:
MyClass() : data(100) {} // 显式初始化成员
};
原因:多个基类的构造函数调用顺序不明确
解决方案:
class Base1 {
public:
Base1() { std::cout << "Base1\n"; }
};
class Base2 {
public:
Base2() { std::cout << "Base2\n"; }
};
class Derived : public Base1, public Base2 {
public:
Derived() : Base2(), Base1() {} // 实际调用顺序仍按继承顺序(Base1先)
// 正确做法是理解调用顺序是按继承声明顺序
};
= default
明确表示使用默认行为#include <iostream>
#include <string>
class Animal {
public:
Animal() : name("Unknown") {
std::cout << "Animal default constructor\n";
}
Animal(const std::string& n) : name(n) {
std::cout << "Animal parameterized constructor\n";
}
protected:
std::string name;
};
class Dog : public Animal {
public:
// 隐式默认构造函数会调用Animal的默认构造函数
Dog() = default;
// 显式调用基类构造函数
Dog(const std::string& n) : Animal(n) {
std::cout << "Dog constructor\n";
}
void bark() {
std::cout << name << " says woof!\n";
}
};
int main() {
Dog d1; // 调用Animal默认构造函数
d1.bark(); // 输出: Unknown says woof!
Dog d2("Buddy"); // 调用Animal参数化构造函数
d2.bark(); // 输出: Buddy says woof!
return 0;
}
这个示例展示了继承类默认构造函数的行为,以及如何显式调用基类构造函数。
没有搜到相关的文章