C 构造函数订单,而虚拟继承
C++ constructor order while virtual inheritance
class Animal {
public:
Animal(const char * color, int childs, float avgLifetime) {
//Do something
}
};
class Birds: virtual public Animal {
public:
Birds(const char * color, int childs, float avgLifetime, float incubation)
: Animal(color, childs, avgLifetime) {
//Do something
}
};
class Flamingo: public Birds {
public:
Flamingo(const char * color, int childs, float avgLifetime, float incubation, float avgHeight)
: Animal(color, childs, avgLifetime),
Birds(color, childs, avgLifetime, incubation) {
//Do something
}
};
当我尝试创建新的Flamingo
时,我跳过了Animal
构造函数。
我想这是因为Birds
是继承人Virtual Animal
。
我认为它将按顺序到达:
Animal->Birds->Flamingo
为什么跳过动物构造函数?
由于Birds
使用Animal
使用虚拟继承,因此Birds
的任何派生也使用Animal
使用虚拟继承。特别是:
class Flamingo : public Birds { /* ... */ };
隐式等同于:
class Flamingo : virtual Animal, public Birds { /* ... */ };
,如果您已经明确编写了它,那么您将期望将代码添加到Flamingo
上以调用Animal
上的构造函数(或允许Flamingo
隐式调用Animal
的默认构造函数(。此外,Flamingo
的Animal
实例的初始化覆盖了Birds
'。
因此,初始化仍然是 Animal
→Birds
→Flamingo
,但是Animal
初始化是Flamingo
所做的,并且Birds
'初始化被跳过,因为Animal
已经初始化。
带有虚拟碱基,它是称为虚拟基础构造函数的最派生的类。
因此,在您的情况下:
class Flamingo: public Birds {
public:
Flamingo(const char* color,
int childs,
float avgLifetime,
float incubation,
float avgHeight) :
// Animal(), // it is this one which is called
Birds(color, childs, avgLifetime, incubation)
{}
// ...
};
鸟类中的那个被忽略:
class Birds: virtual public Animal {
public:
Birds(const char* color,
int childs,
float avgLifetime,
float incubation) :
Animal(color, childs, avgLifetime) // Not called for Flamingo
{}
//Do something
};
相关文章:
- 大小虚拟继承中的派生类
- C++ 多级虚拟继承编译问题
- 如何正确获得虚拟继承?
- 避免C++虚拟继承
- 虚拟继承基构造函数消除
- 虚拟继承中是否存在多重继承?
- 了解虚拟继承类 vtables 和 vptr 创建
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- C++ 不明确访问 - 虚拟继承
- 虚拟继承中来自基数的虚拟调用
- 虚拟继承:调用没有匹配函数
- 虚拟继承的内部机制
- 联合虚拟继承
- C++虚拟继承类的大小
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 虚拟继承构造函数的组装
- 虚拟继承情况下类的意外大小
- 虚拟继承情况下的 vtable
- C++解决没有虚拟继承的钻石继承问题