菱形继承编译产生两个错误
1、no unique final overrider for(最终重载不唯一)
2、请求有歧义
#include <iostream>
using namespace std;
class A
{
public:
virtual void f()
{}
};
class B : public A
{
public:
virtual void f() {}
};
class C : public A
{
public:
virtual void f() {}
};
class D : public B, public C
{
/* some code */
};
int main()
{
D d;
d.f(); //如果有这行编译就会有问题,f函数有歧义
return 0;
}
[codetest]$g++ test.cpp
test.cpp: 在函数‘int main()’中:
test.cpp:41:7: 错误:对成员‘f’的请求有歧义
d.f(); //如果有这行编译就会有问题,f函数有歧义
^
test.cpp:15:18: 附注:备选为: ‘virtual void A::f()’
virtual void f()
^
test.cpp:28:18: 附注: ‘virtual void C::f()’
virtual void f() {}
^
test.cpp:22:18: 附注: ‘virtual void B::f()’
virtual void f() {}
^
#include <iostream>
class A
{
public:
virtual void f()
{
}
};
class B : virtual public A
{
virtual void f() {}
};
class C : virtual public A
{
virtual void f() {}
};
class D : public B, public C
{
/* some code */
};
int main()
{
D d;
return 0;
}
[codetest]$g++ test01.cpp
test01.cpp:28:7: 错误:‘virtual void A::f()’的最终重载在‘D’中不唯一
class D : public B, public C
^
这里可以从宏观的角度取思考,B重写了A的f函数,C又重写了A的f函数,因为是虚继承,所以D中只会有一份A的f函数,那么问题来了,这一份f是从B来还是从C来?所以就需要在D中重载,保证唯一。要和上面的对成员‘f’的请求有歧义这个编译错误区分开来。上面的D中是有两份f函数的。