gpt4 book ai didi

c++ - 类的构造函数必须显式初始化基类

转载 作者:太空狗 更新时间:2023-10-29 21:31:42 24 4
gpt4 key购买 nike

我有:

//all classes are in different files
namespace Tree {
class Node {
NodeType type;
protected:
std::string nodename;
Node(Node::NodeType _type) : type(_type) {}
};
}

class Parent : public virtual Tree::Node {
protected:
Parent() : Node(Node::UNDEFINED) {}
};

class Child: public virtual Tree::Node {
protected:
Child() : Node(Node::UNDEFINED) {}
};

namespace Tree {
class Element :
public Parent,
public Child,
public virtual Node {

protected:
Element() : Node(Node::ELEMENT) {}
};
}

class SpecificElement: public Tree::Element {
public:
SpecificElement(const std::string name) {
nodename = name;
}
};

SpecificElement的构造函数中出现错误:

Constructor for 'SpecificElement' must explicitly initialize the base class 'Tree::Node' which does not have a default contructor

Node 不是应该通过 Element 初始化吗?为什么编译器要求我在那里显式初始化?

我不知道这和 builder 被保护有没有关系。或者,如果它是针对命名空间的,虽然我不这么认为,因为代码已编译,直到我引入类 SpecificElement

我会在 SpecificElement 中调用 Node 的构造函数,但我有更多的类继承自此,并且总的来说要求我显式初始化 Node,而我无法通过设计做到这一点。

编辑:感谢@r-sahu,我按如下方式解决了

namespace Tree {
class Node {
protected:
std::string nodename;
NodeType type; //changed to protected

Node(Node::NodeType _type) : type(_type) {}
Node() : Node(UNDEFINED) {} //default constructor
};
}

namespace Tree {
class Element :
public Parent,
public Child,
public virtual Node {

protected:
Element() { //change the init constructor list
type = Node::ELEMENT; //change type inside constructor
}
};
}

最佳答案

Isn't Node supposed to be initialized through Element?, why the compiler ask me for explicitly initialize there?

没有。

只有当您创建 Element 的实例时才会发生这种情况,而不是 Element 的子类。这与虚拟继承有关。

虚拟继承的类必须在最派生类的构造函数中正确初始化。因此,您必须使用:

SpecificElement(const std::string name) : Tree::Node(Node::ELEMENT) {
nodename = name;
}

有了它,当您构造 SpecificElement 的实例时,Tree::Node 子对象仅从 的构造中初始化一次特定元素Element 的构造函数中的 Tree::Node(Node::Element) 部分在运行时被忽略。

可以在 Section 12.6.2 Initializing bases and members/10.1 中的标准中找到此行为的理由。

关于c++ - 类的构造函数必须显式初始化基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57550781/

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