【发布时间】:2019-11-28 14:22:18
【问题描述】:
我用虚拟继承解决了菱形问题。这里的情况不是钻石但我想了解虚拟继承:
class Base
{
public:
explicit Base(int arg)
: arg { arg }
{}
const int arg;
};
class Virtual : public virtual Base
{
public:
explicit Virtual(int _arg)
//: Base(_arg)
{}
};
class Target : public virtual Virtual
{
public:
explicit Target(int _arg)
: Base(_arg),
Virtual(_arg)
{}
};
因此,由 Target 一起继承的 Virtual 或 Virtual2 将具有单个 Base 实例。在这里,我认为在 Target 构造函数中调用 Base 构造函数将创建所需的实例,我可以在 Virtual 中省略 Base 构造函数,但随后出现错误:
错误:“Virtual”的构造函数必须显式初始化没有默认构造函数的基类“Base”
那么,如果假设不被调用,那里的构造函数真的有必要吗?
在实际情况中,我在构造函数中使用 lambda 对参数进行了一些更改,所以我不知道是否需要重复。
【问题讨论】:
-
fwiw 我试图改正错别字,但在把它们全部赶上之前我已经累了
-
是的,
Target也需要初始化Base -
"但我不知道为什么 Virtual 需要" -
Base和Virtual都不是默认可构造的,因此您需要指定构造函数并提供参数它需要。但是请注意,在实例化Target时,Base只会直接从Target初始化,并且您传递给Virtual的参数只会被Virtual:s 构造函数使用,而不是Base: @ 987654323@