C++类继承之子类调用父类的构造函数的实例详解
在C++的类继承中,派生类可以通过调用基类的构造函数来完成对基类部分的初始化,这个过程叫做子类调用父类的构造函数。本文将会详细讲解如何在C++继承中实现子类调用父类的构造函数,包括示例说明和实际应用场景。
子类如何调用父类的构造函数
子类调用父类的构造函数一般通过子类的初始化列表来完成。子类初始化列表中使用基类名来标识使用哪个基类的构造函数进行初始化,如下所示:
class Parent {
public:
Parent(int a, int b) : _a(a), _b(b) {
std::cout << "Parent constructor called" << std::endl;
}
private:
int _a;
int _b;
};
class Child : public Parent {
public:
Child(int a, int b, int c) : Parent(a, b), _c(c) {
std::cout << "Child constructor called" << std::endl;
}
private:
int _c;
};
在上面的代码中,子类Child的初始化列表中调用了基类Parent的构造函数,完成了对Parent部分的初始化。可以看到,在初始化Child类的对象时,先调用了Parent类的构造函数,再调用了Child类的构造函数。
实际应用场景
1. 多继承时保证基类的构造函数按照正确的顺序被调用
当一个派生类继承了多个基类时,需要注意基类构造函数的调用顺序,以及在子类的初始化列表中正确调用基类的构造函数。
class A {
public:
A() {
std::cout << "A constructor called" << std::endl;
}
};
class B {
public:
B() {
std::cout << "B constructor called" << std::endl;
}
};
class C : public A, public B {
public:
C() : A(), B() {
std::cout << "C constructor called" << std::endl;
}
};
在上面的代码中,派生类C继承了两个基类A和B,因为构造函数的调用顺序是从左到右的,所以需要在初始化列表中按照正确的顺序调用基类的构造函数。
2. 基类构造函数需要传递参数
如果基类的构造函数需要传递参数,那么需要在子类的初始化列表中调用基类的构造函数并传递正确的参数。
class Base {
public:
Base(int x) : _x(x) {
std::cout << "Base constructor called with x = " << _x << std::endl;
}
virtual void print() {
std::cout << "Base::_x = " << _x << std::endl;
}
private:
int _x;
};
class Derived : public Base {
public:
Derived(int x, int y) : Base(x), _y(y) {
std::cout << "Derived constructor called with x = " << x
<< " and y = " << _y << std::endl;
}
void print() override {
std::cout << "Derived::_y = " << _y << std::endl;
}
private:
int _y;
};
在上面的代码中,派生类Derived调用了基类Base的构造函数并传递了参数x,在子类的构造函数中也完成了对派生类部分的初始化。同时,派生类Derived重写了基类Base的虚函数print,输出了派生类的数据成员_y的值。
总结
子类调用父类的构造函数是C++继承中一个非常重要的概念,通过子类的初始化列表可以完成对基类部分的初始化。在多继承场景和需要传递参数给基类构造函数的场景下,需要注意初始化列表中基类构造函数的调用顺序和传递正确的参数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类继承之子类调用父类的构造函数的实例详解 - Python技术站