我有一个 Shape->
、Triangle->
和 Triforce
的层次结构,它们都有一个私有(private)字符串成员 sName。
`Shape::Shape(string name) : sName(name){}`
在 Triforce 类(继承自 Triangle)中,我可以使用这个构造函数:
Triforce::Triforce(string name) : Triangle(name){}
但是这个
Triforce::Triforce(string name) : Shape(name){}
给出错误:`非法成员初始化'Shape'不是基础或成员。
这是如何运作的?既然它们都在同一个层次结构中,为什么调用父编译器而不调用基类呢?
最佳答案
每个 Triangle
构造函数都必须 - 显式或隐式 - 调用其中一个 Shape
构造函数,因此在 Triforce
中选择哪个 是合理的>Triangle
指导员调用并让它协调 Shape
构造,但在您尝试执行时干扰 Shape
构造是不合理的 - Triangle
构造函数应该知道已经构造了它的基础 Shape
对象?您应该保留 Triforce::Triforce(const std::string& name) : Triangle(name) { }
构造函数并删除试图调用 Shape
构造函数的构造函数。
关于c++ - 基类与派生类共享字段名时的非法成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164148/