在这里的派生类中,如何解决歧义


#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版本)。如果您在basebase2打字指针/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同时实现basebase2版本。如果通过虚拟方法表实现它(只有一个可能的实现),则(AFAIK)通常在派生中为每个碱基提供两个虚拟表,并且两者都包含相同的function2的指针。

程序的输出是:

derived function
base function1

另外,解决函数调用function2()没有歧义,因为您使用了混凝土派生的类对象dclass derived具有其自己的成员函数function2()。您只是尝试通过该类的对象调用类的成员函数。

我想您正在寻找多级继承的钻石问题。

最新更新