首页 > 后端开发 > C++ > 正文

为什么实例化派生类对象时会调用虚拟基类的默认构造函数?

Linda Hamilton
发布: 2024-11-20 04:22:02
原创
617 人浏览过

Why is the Default Constructor of a Virtual Base Class Invoked when a Derived Class Object is Instantiated?

虚拟继承中的默认构造函数调用

虚拟继承是一种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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板