虚拟继承和默认构造函数调用
在涉及虚拟继承的继承层次结构中,虚拟基类的默认构造函数可能会被意外调用。考虑以下代码:
class grandmother { public: grandmother() { // Default constructor std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { // Parameterized constructor std::cout << "grandmother: " << attr << std::endl; } }; class mother: virtual public grandmother { public: mother(int attr) : grandmother(attr) { std::cout << "mother: " << attr << std::endl; } }; class daughter: virtual public mother { public: daughter(int attr) : mother(attr) { std::cout << "daughter: " << attr << std::endl; } }; int main() { daughter x(0); }
当创建子类的实例时,输出为:
grandmother (default) mother: 0 daughter: 0
尽管祖母类中存在参数化构造函数,但调用默认构造函数。为什么会发生这种情况?
虚拟基类构造函数的调用
在虚拟继承中,虚拟基类的构造函数直接被最远派生类的构造函数调用。在这种情况下,子构造函数直接调用祖母构造函数。
由于母类没有在其初始化列表中显式调用祖母构造函数,因此使用默认构造函数。要正确调用所需的构造函数,应将子构造函数修改为:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
通过显式调用初始化列表中的 grandma(attr) 构造函数,使用正确的构造函数,输出变为:
grandmother: 0 mother: 0 daughter: 0
以上是为什么在虚拟继承层次结构中调用虚拟基类的默认构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!