在C++中,子类的构造函数会自动调用基类的构造函数,以确保基类的成员变量被正确地初始化。如果没有显式地调用基类的构造函数,则会默认调用基类的无参构造函数。
例如,假设我们有一个基类`Base`和一个派生类`Derived`,它们的构造函数如下:
```
class Base {
public:
Base(int x) : m_x(x) {}
private:
int m_x;
};
class Derived : public Base {
public:
Derived(int x, int y) : Base(x), m_y(y) {}
private:
int m_y;
};
```
在上面的代码中,`Base`类中定义了一个带参数的构造函数,而`Derived`类中定义了一个带两个参数的构造函数。在`Derived`类的构造函数中,我们通过调用`Base`类的构造函数来初始化基类的成员变量。这样做可以确保在创建`Derived`对象时,`Base`类的成员变量也能够被正确地初始化。
需要注意的是,在调用基类的构造函数时,必须使用初始化列表(initializer list),而不能在构造函数体中直接赋值。例如,下面的代码是错误的:
```
class Derived : public Base {
public:
Derived(int x, int y) {
Base(x); // 错误:不能在构造函数体中调用基类的构造函数
m_y = y;
}
private:
int m_y;
};
```
在上面的代码中,我们试图在`Derived`类的构造函数体中调用基类的构造函数,但这是错误的。正确的做法是使用初始化列表来调用基类的构造函数:
```
class Derived : public Base {
public:
Derived(int x, int y) : Base(x), m_y(y) {}
private:
int m_y;
};
```
在上面的代码中,我们使用初始化列表来调用基类的构造函数,并同时初始化派生类