【发布时间】:2016-07-02 09:01:54
【问题描述】:
我有这部分代码
#include <iostream>
using namespace std;
class A {
public:
int i;
A(){i = 0; }
virtual void f() { cout << i; }
};
class B1 : virtual public A {
public:
B1() { f(); }
void f() { cout << i+10; }
};
class B2 : virtual public A {
public:
B2() { f(); }
void f() { cout << i+1; }
};
class C : public B1, public B2 {
public:
C() {}
};
void main(){
C c;
//c.A::f();
}
首先,我了解使用虚拟继承(菱形)在内存中只创建一个A 对象的主要思想。
在此示例中,我在 C 类中遇到编译错误:
override of virtual function "A::f" is ambiguous
如果我删除 virtual 继承。代码编译,C 类中没有错误。
如果我从最后一个代码行中删除注释,它仍然可以编译。我知道在这种情况下,将执行的 f() 函数是 C 继承自的第一个类中的函数。
现在,如果我将 c.A::f() 替换为 c.f(),我会在此特定行收到编译错误。
有人可以解释一下这种行为以及这些案例之间的区别吗?
【问题讨论】:
-
谁说跑题了???这只是重复。