gpt4 book ai didi

c++ - 从多重继承/菱形继承(钻石问题)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:13 26 4
gpt4 key购买 nike

我有以下场景:

class A
{
public:
A(std::string id);
};

class B : public virtual A
{
public:
B();
};

class C : public virtual A
{
public:
C();
};

class D : public B, public C
{
public:
D(std::string id);
};


D::D(std::string id) : A(id), B(), C()
{
}


class X : public D
{
public:
X(std::string id);
}

X::X(std::string id) : D(id)
{
}

现在,如果我创建 D 的实例,一切正常。但是,如果我创建 X 的实例,我会收到一个编译器错误,它告诉我某些东西试图调用 A 的默认构造函数——它不存在。如果我创建它,它会编译,但只会调用默认构造函数,因此,id 未正确设置/初始化。

这可以通过像这样实现 X 的构造函数来解决:

X::X(std::string id) : A(id), D(id)
{
}

但我的理解是,这应该是不必要的。那么我的错误在哪里?

最佳答案

您需要将所有构造函数设为public 并为A 定义一个默认构造函数,因为字符串构造函数会将默认构造函数标记为=delete >。此外,the most derived class will initialize any virtual base class , 引自 draft Standard :

12.6.2 初始化基和成员[class.base.init]

10 In a non-delegating constructor, initialization proceeds in the following order: — First, and only for the constructor of the most derived class (1.8), virtual base classes are initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base classes, where “left-to-right” is the order of appearance of the base classes in the derived class base-specifier-list.

在这种情况下,这意味着 X 确实必须初始化 A

#include <iostream>
#include <string>

class A
{
public:
A() { std::cout << "A\n"; }
A(std::string id) { std::cout << id << " A(id)\n"; }
};

class B : public virtual A
{
public:
B() { std::cout << "B\n"; }
};

class C : public virtual A
{
public:
C() { std::cout << "C\n"; }
};

class D : public B, public C
{
public:
D(std::string id): A(id) { std::cout << id << " D(id)\n"; }
};


class X : public D
{
public:
X(std::string id): A(id), D(id) { std::cout << id << " X(id)\n"; }
};

int main()
{
X x("bla");
x;
}

关于c++ - 从多重继承/菱形继承(钻石问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14583688/

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