#include <iostream>
using namespace std;
class base
{
public:
virtual void function1(){
cout<<"base function1"<<endl;
}
virtual void function2()=0;
};
class base2
{
public:
virtual void function2()=0;
};
class derived : public base, base2
{
public:
void function2(){
cout<<"derived function"<<endl;
}
};
int main()
{
derived d;
d.function2();
d.function1();
}
这里的两个基类包含函数2()作为纯虚拟函数。派生的类继承两个基类。函数2()在派生中实现。在这种情况下,编译器如何解决歧义。欢迎输入。
没有歧义。如果您在derived
上调用function2()
,则编译器确切知道要调用哪个功能(IT的derived
版本)。如果您在base
或base2
打字指针/Ref上调用它,则编译器还知道该调用什么(通过该特定基础的虚拟函数表)。
在这种情况下,歧义发生了:
class base
{
public:
void func(){
cout<<"base func"<<endl;
}
};
class base2
{
public:
void func(){
cout<<"base2 func"<<endl;
}
};
class derived : public base, public base2
{
public:
void func2(){
func(); // ??? which one to call ???
}
};
为什么它在原始情况下起作用的原因是编译器使用derived::function2
同时实现base
和base2
版本。如果通过虚拟方法表实现它(只有一个可能的实现),则(AFAIK)通常在派生中为每个碱基提供两个虚拟表,并且两者都包含相同的function2
的指针。
程序的输出是:
derived function
base function1
另外,解决函数调用function2()
没有歧义,因为您使用了混凝土派生的类对象d
。class derived
具有其自己的成员函数function2()
。您只是尝试通过该类的对象调用类的成员函数。
我想您正在寻找多级继承的钻石问题。