#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();
}
这里有两个基类包含function2()作为纯虚函数。派生类继承了两个基类。 function2()在派生中实现。编译器如何解决这种情况下的歧义。欢迎输入。
答案 0 :(得分:2)
没有歧义。如果您在function2()
上调用derived
,则编译器确切地知道要调用哪个函数(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
的指针。
答案 1 :(得分:1)
您的计划的输出是:
derived function
base function1
此外,解析函数调用function2()
时没有歧义,因为您使用了具体的派生类对象d
。 class derived
具有自己的成员函数function2()
。您只是尝试通过该类的对象调用类的成员函数。