如何在派生类中解决这种氛围?

时间:2016-11-23 10:05:13

标签: c++ inheritance

#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()在派生中实现。编译器如何解决这种情况下的歧义。欢迎输入。

2 个答案:

答案 0 :(得分:2)

没有歧义。如果您在function2()上调用derived,则编译器确切地知道要调用哪个函数(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的指针。

答案 1 :(得分:1)

您的计划的输出是:

derived function
base function1

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

我猜你在寻找Diamond Problem in case of Multilevel Inheritance.