C++ 虚拟基类初始化

C++ 虚拟基类初始化,c++,c++11,constructor,virtual-inheritance,ctor-initializer,C++,C++11,Constructor,Virtual Inheritance,Ctor Initializer,我正在进行一项测试,我很难理解这一点: #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(doub

我正在进行一项测试,我很难理解这一点:

#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;
}
#包括
结构车
{
汽车():价格(20000){}
汽车(双b):价格(b*1.1){}
双倍价格;
};
struct丰田:公共虚拟汽车
{
丰田(双b):汽车(b){}
};
结构普锐斯:公共丰田
{
普锐斯(双b):丰田(b){}
};
int main(int argc,字符**argv)
{
普锐斯p(30000);

std::cout只需为(间接)虚拟基添加mem初始值设定项:

Prius(double b) : Car(b), Toyota(b)  {}
看到了

虚拟继承确保虚拟基在整个对象中只存在一次。因此,初始化虚拟基不是某个中间基的任务,它甚至可能不是唯一一个请求它的中间基:哪个应该得到批准?
相反,构造函数被分成两部分:一个用于初始化除虚基以外的所有内容,不管是直接的还是间接的,并且由派生类使用;另一个用于首先初始化虚基,然后将其余部分委托给前者,后者用于创建完整对象


如果mem初始值设定项的顺序错误,大多数编译器都会发出警告,因此稍后您不会对代码的实际操作感到惊讶。这可能是编译器指出的错误…

删除虚拟继承:

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) {}
};

Toyota
Is-a
Car
,不需要虚拟继承


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

非常感谢,我得到了!