虚基类的构造函数在非虚基类之后调用
时间: 2024-06-22 11:03:14 浏览: 8
在C++中,虚基类(Virtual Base Class,简称VBC)是一种特殊的基类,它的目的是为了解决基类继承层次结构中的循环引用问题。当一个派生类有多个基类,且这些基类中有一个或多个是相互依赖的(即形成了循环),那么就会引发二义性,因为每个派生类都会有一份相同的虚基类的拷贝。
虚基类的构造函数执行顺序遵循以下规则:
1. 非虚基类的构造函数总是首先被调用,无论它们是否出现在声明中的顺序。
2. 虚基类的构造函数只有在遇到第一个使用该虚基类的派生类时才会被调用。这意味着即使在声明中,虚基类的构造函数也可能晚于其他非虚基类。
简单来说,如果`BaseA`和`BaseB`都是`Derived`类的虚基类,并且`BaseA`先于`BaseB`声明,那么在`Derived`构造时,`BaseA`的构造函数会先被执行,然后是`BaseB`的构造函数,即使`BaseB`被声明为虚基类。
如果你对虚基类的使用场景、作用以及如何避免二义性有更多疑问,欢迎提问。
相关问题
虚基类构造函数的调用顺序是如何规定的
在多重继承中,如果有虚基类,派生类的构造函数必须负责调用虚基类的构造函数。虚基类构造函数的调用顺序是按照它们在继承层次中出现的顺序来决定的,而不是按照它们在成员初始化列表中的顺序来决定的。
具体来说,派生类在构造函数中必须显式调用虚基类的构造函数,而且必须在成员初始化列表中完成。如果没有显式调用虚基类的构造函数,编译器会调用默认的构造函数,这可能导致程序出错。
示例代码如下:
```c++
class Animal {
public:
Animal(int age) {
cout << "Animal constructor, age = " << age << endl;
}
};
class Mammal : virtual public Animal {
public:
Mammal(int age) : Animal(age) {
cout << "Mammal constructor" << endl;
}
};
class WingedAnimal : virtual public Animal {
public:
WingedAnimal(int age) : Animal(age) {
cout << "WingedAnimal constructor" << endl;
}
};
class Bat : public Mammal, public WingedAnimal {
public:
Bat(int age) : Animal(age), Mammal(age), WingedAnimal(age) {
cout << "Bat constructor" << endl;
}
};
int main() {
Bat bat(5);
return 0;
}
```
输出结果为:
```
Animal constructor, age = 5
WingedAnimal constructor
Mammal constructor
Bat constructor
```
在上面的例子中,Animal是虚基类,Mammal和WingedAnimal都通过虚继承来继承Animal。Bat类继承了Mammal和WingedAnimal,它必须显式调用Animal、Mammal和WingedAnimal的构造函数,并且必须按照它们在继承层次中出现的顺序来调用。因此,Bat的构造函数中先调用Animal的构造函数,然后调用WingedAnimal的构造函数,最后调用Mammal的构造函数。
在最后派生类构造函数的调用中,先调用虚基类的构造函数,在调用其它基类的构造函数时不再调用虚基类的构造函数
这句话是错误的。在最后派生类构造函数的调用中,先调用所有虚基类的构造函数,然后按照基类的继承顺序依次调用其它基类的构造函数,其中包括间接继承的基类。在执行完所有基类的构造函数后,再执行派生类自己的构造函数。需要注意的是,如果某个类既是虚基类,又是非虚基类的基类,那么它的构造函数会在虚基类构造函数被调用之后被调用。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![ppt](https://img-home.csdnimg.cn/images/20210720083527.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)