虚拟继承模糊函数

时间:2016-07-02 09:01:55

标签: c++ multiple-inheritance

我有这部分代码

#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 class:

中收到编译错误
override of virtual function "A::f" is ambiguous

如果我删除了virtual继承。代码编译,类C中没有错误像以前一样。

如果我从最后一个代码行中删除注释,它仍会编译。我理解在这种情况下,将要执行的f()函数是C继承自的第一个类中的函数。

现在,如果我用c.A::f()替换c.f(),我会在此特定行收到编译错误。

有人可以解释一下这种行为以及这些案件之间的区别吗?

2 个答案:

答案 0 :(得分:3)

问题在于C没有表达式调用。由于f是虚拟的,并且在B1B2中重新定义了两次,因此C类格式错误,因为对f的调用不明确(可以选择覆盖) ?)。在f中添加C的覆盖,一切都会好的。

答案 1 :(得分:-1)

在C类中,您必须选择f的哪个变体到usr。即using B1::f;using B2::f