我试图理解多重继承,这是我的代码:
struct A {
A() {}
static int n;
static int increment() { return ++n; }
};
int A::n = 0;
struct B : public A {};
struct C : public A {};
struct D : public B, C {};
int main() {
D d;
cout<<d.increment()<<endl;
cout<<d.increment()<<endl;
}
这段代码有效。但是,如果我改变increment()
到非静态它将失败。
我的问题:
- 为什么编译器抱怨非静态版本的不明确调用
increment()
,同时满足静态的?
- 如果我添加另一个
increment()
函数到B或C,编译器也会抱怨,即使声明为静态。为什么?
暧昧是什么意思?
当编译器无法根据上下文决定调用哪个函数时,就会抱怨调用不明确。因此,为了理解投诉,您必须检查可能存在的歧义。
为什么编译器抱怨非静态版本的increment()的调用不明确,而满足静态版本?
根据定义,一个static
类的函数不依赖于该类的任何实例。您可以将其称为A::increment()
(参见,没有实例)。
菱形继承的问题不在于编译器不知道是哪一个code执行,就是不知道是哪个this
提供(有两个A
在你的D
对象,其中包含一个B
和一在C
).
当您使用static
的函数A
,没有隐含的this
通过了,所以没有问题;如果你尝试使用非static
函数,那么编译器无法决定是否this
应该指向A
in B
or in C
,这是有歧义的。
如果我向B或C添加另一个increment()函数,编译器也会抱怨,即使声明为静态。为什么?
此时,编译器可能会选择B::increment()
and C::increment()
,应该选择哪个?这是模棱两可的。
当您有线性层次结构时,它会调用与其“最接近”的层次结构(这会隐藏继承树中更下方的层次结构),但在这里B
and C
是两个独立的分支,并且没有“更好”的分支。
注意:即使B
不实施increment
, since A
你可以打电话吗B::increment()
这实际上调用了A::increment()
。同样适用于C
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)