若虚基类由基类派生而来,则仍然先调用基类构造函数,在调用派生类构造函数
时间: 2024-03-11 12:44:21 浏览: 17
是的,如果一个虚基类是由另一个基类派生而来,那么在构造派生类的对象时,仍然是先调用虚基类所在的基类的构造函数,然后才会调用派生类的构造函数。这是因为虚基类的构造函数必须在其最远的派生类的构造函数中初始化,而最远的派生类的构造函数是通过调用所有中间基类的构造函数来进行初始化的。因此,如果一个虚基类是由另一个基类派生而来,那么在构造派生类的对象时,仍然需要先初始化虚基类所在的基类,然后才能够初始化派生类。
相关问题
在类的派生中为什么要引入虚基类?虚基类构造函数的调用顺序是如何规定的?
在类的派生中引入虚基类是为了解决多重继承带来的问题,即当一个类同时从多个类派生而来时,如果其中有相同的基类,则可能会导致该基类在派生类中出现多份,从而导致数据冗余和访问不一致的问题。
为了解决这个问题,可以使用虚继承,即在公共基类前面加上关键字“virtual”。这样做的目的是使得公共基类在派生类中只出现一次,从而避免了数据冗余和访问不一致的问题。
虚基类的构造函数调用顺序是根据虚基类在继承体系中的位置来决定的。具体来说,当一个派生类同时继承多个虚基类时,先调用最远的虚基类的构造函数,然后依次调用其它虚基类的构造函数,最后调用派生类自身的构造函数。这个顺序确保了每个构造函数都能够在需要的时候访问到其所依赖的对象。
派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用
是的,派生类构造函数的成员初始化列表中必须包含对所有直接基类的构造函数的调用,包括虚基类的构造函数。如果派生类同时继承了多个虚基类,那么必须按照它们在继承列表中的顺序依次调用它们的构造函数。如果不这样做,会导致虚基类对象被多次构造,进而导致程序行为的不可预期。例如:
```c++
class A {
public:
A(int i) {}
};
class B : virtual public A {
public:
B() {}
};
class C : virtual public A {
public:
C() {}
};
class D : public B, public C {
public:
D() {}
};
```
在这个例子中,类 D 继承了类 B 和类 C,这两个类都直接继承了虚基类 A。因此,类 D 的构造函数中必须包含对虚基类 A 的构造函数的调用,例如:
```c++
class D : public B, public C {
public:
D() : A(42), B(), C() {}
};
```
在这个例子中,我们按照 A、B、C 的顺序依次调用它们的构造函数,并且在 A 的构造函数中传递了一个整数参数 42。这样就可以保证虚基类 A 只被构造一次。