为什么在虚拟继承中要调用Default构造函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (46)

我不明白为什么在下面的代码中,当我instanciate类型的对象daughter,默认的grandmother()构造函数被调用?

我的代码:

#include <iostream>

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

int main() {
  daughter x(0);
}
提问于
用户回答回答于

当使用虚拟继承时,虚拟基类的构造函数被大多数派生类的构造函数直接调用。在这种情况下,daughter构造函数直接调用grandmother构造函数。

由于你没有grandmother在初始化列表中显式调用构造函数,因此将调用默认的构造函数。要调用正确的构造函数,请将其更改为:

daugther(int attr) : grandmother(attr), mother(attr) { ... }

另请参阅此FAQ条目

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券