gpt4 book ai didi

c++ - 如何创建仅调用祖父构造函数的构造函数?

转载 作者:行者123 更新时间:2023-12-04 07:45:29 26 4
gpt4 key购买 nike

我在层次结构中有 3 个类(称为 A、B 和 C),其中 B 扩展 A 和 C 扩展 B。类 A 有一个接受单个参数的构造函数。 C 的定义要求调用 A 的构造函数,所以我试图通过在 B 中创建一个构造函数来做到这一点。但是,编译器告诉我 C 的构造函数必须同时初始化 A 和 B。这对我来说似乎违反直觉,因为它真的应该只初始化一次。
这是更好地说明我面临的问题的代码:

#include <iostream>

struct A {
A(std::string name) : name_(name) {
std::cout << "A ctor called: " << name << std::endl;
}
std::string name_;
};

struct B : virtual public A {
// This constructor is required or else subclasses cannot be constructed properly
B(std::string name) : A(name) {
std::cout << "B ctor called: " << name << std::endl;
}
};

struct C : virtual public B {

// ERROR: constructor for 'C' must explicitly initialize the base class 'A' which does not have a default constructor
// C() : B("hey") {}

// ERROR: constructor for 'C' must explicitly initialize the base class 'B' which does not have a default constructor
// C() : A("hey") {}

// ok... but have to pass the same name twice & init'ed twice!
C() : A("wat"), B("hey") {
std::cout << "C ctor called" << std::endl;
}

// gcc reorders the constructor invocations...
// here it's written as B then A but it would be init'ed in the order of A then B
// C() : B("hey"), A("wat") {
// std::cout << "C ctor called" << std::endl;
// }

// ok... we can just pass a name but it's still init'ed twice!
// C(std::string name) : B(name), A(name) {}
};

int main() {
C c;
std::cout << c.name_ << std::endl;
}
当我运行代码时,我得到:
A ctor called: wat
B ctor called: hey
C ctor called
wat
我的问题是:
  • 有没有一种更简洁的方法来编写它,这样我就不必显式调用 A 和 B 的构造函数?
  • 为什么输出显示hey稍后设置,但 name_字段包含 wat (这是之前设置的)?
  • 最佳答案

    在你的解释中,你没有说你实际上是在做这件事。看到你的代码后,我去了OMG。
    首先,问问自己“为什么我需要虚拟推导?”可能没有充分的理由。
    如果您认为有充分的理由,那么很可能没有。
    如果您仍然坚持虚拟推导,没有充分理由,请参阅:https://isocpp.org/wiki/faq/multiple-inheritance

    关于c++ - 如何创建仅调用祖父构造函数的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67219462/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com