虚拟继承中的默认构造函数调用
虚拟继承是一种C继承机制,旨在解决菱形继承或重复继承的问题。在这种情况下,就出现了一个问题:为什么在实例化派生类对象时会调用虚拟基类的默认构造函数?
这种行为源于虚拟继承的设计。与传统继承中派生类构造函数通过初始化列表调用基类构造函数不同,在虚拟继承中,最底层派生类的构造函数直接调用虚拟基类的构造函数。
中提供的示例:
class grandmother { public: grandmother() { std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { 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; } };
实例化女儿类型的对象时,女儿构造函数直接调用祖母构造函数。但是,由于子构造函数的初始化列表中没有调用具体的构造函数,因此默认调用祖母的默认构造函数。
要显式调用所需的构造函数,必须修改子构造函数的初始化列表to:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
通过这样做,正确的祖母构造函数被调用,输出将包括以下内容line:
grandmother: 0
在使用虚拟继承时理解此行为至关重要,因为它可以确保正确的初始化和对象构造。
以上是为什么实例化派生类对象时会调用虚拟基类的默认构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!