虚拟基类初始化



我正在做一个测试,我很难理解这个:

#include <iostream>
struct Car
{
Car() : price(20000) {}
Car(double b) : price(b*1.1) {}
double price;
};
struct Toyota : public virtual Car 
{
Toyota(double b) : Car(b) {}
};
struct Prius : public Toyota
{
Prius(double b) : Toyota(b)  {}
};
int main(int argc, char** argv)
{
Prius p(30000);
std::cout << p.price << std::endl;
return 0;
}

返回值是 20 000,但实际上我不明白为什么:

表示虚拟基类的所有子对象都由派生最多的类的构造函数初始化。 如果派生最多的类的构造函数没有为虚拟基类 V 指定 mem 初始值设定项,则调用 V 的默认构造来初始化虚拟基类子对象。

我尝试了不同的方法来在派生类中创建构造函数,但我从编译器中得到了错误。

有没有人提供解释以及如何创建这样的构造函数?

删除虚拟继承:

struct Car
{
Car() : price(20000) {}
Car(double b) : price(b*1.1) {}
double price;
virtual ~Car() = default;
};
struct Toyota : public Car 
{
Toyota(double b) : Car(b) {}
};

实时运行

ToyotaIs-aCar,不需要虚拟继承。

如果您的测试是关于虚拟继承的,请阅读此处有关虚拟继承的信息

只需为(间接(基本添加 mem 初始值设定项:

Prius(double b) : Car(b), Toyota(b)  {}

在科利鲁上观看直播。

虚拟继承可确保虚拟基在完整对象中仅存在一次。为此,初始化虚拟基地不能是某个中间基地的任务,甚至可能不是唯一一个要求它的人:哪一个应该获得批准?
相反,ctor 被一分为二:一个用于初始化除虚拟基库以外的所有内容,无论是直接的还是间接的,由派生类使用,一个首先初始化虚拟基,然后将其余部分委托给前者,这是创建完整对象所需的那个。

大多数编译器会在你弄错 mem 初始值设定项的顺序时发出警告,这样你以后就不会对代码的实际作用感到惊讶。这可能是您的编译器指出的错误...

最新更新