多重继承中的歧义

时间:2016-07-19 04:29:50

标签: c++ oop inheritance runtime

假设我有这个简单的代码

#include <iostream>
using namespace std;

class A {
 public:
    void show() {
        cout << "A" << endl;
    }
};

class B {
 public:
    void show() {
        cout << "B" << endl;
    }
};

class C:public A, public B {
};

int main()
{
    C obj;
    obj.show();
}

这会抛出编译时错误,因为函数show()的调用是不明确的。我想知道编译器是如何理解这一点的?对象创建是一个运行时进程,因此,编译器如何知道将要创建一个将调用show()的C类对象。有人可以告诉我这背后的概念吗?

4 个答案:

答案 0 :(得分:3)

您继承了基类AB,它们在show中具有相同的方法C。这就是您遇到编译器错误ambiguous access of 'show'的原因。

要克服它,你需要更明确地指出你想要调用的show方法。使用范围解析运算符很容易做到。

  • 调用show的{​​{1}}方法:A;
  • 调用obj.A::show()的{​​{1}}方法:show;

答案 1 :(得分:2)

这个概念在“多态性”中被称为“晚期绑定”。这意味着,代码告诉编译器了解在运行时要做什么。你应该以这种方式使用虚函数;并且仅当您将其与“指针”一起使用时才可用。让我举个例子。

class Teacher {                          //base class
    string name;
    int numOfStudents;
public:
    Teacher( const string &, int );      // constructor of base
    virtual void print() const;          // a virtual (polymorphic) function
};
class Principal : public Teacher{        // derived class
    string SchoolName;
public:
    Principal( const string &, int , const string & );
    void print() const;                  // also virtual (polymorphic)
};

如果在main函数上创建Principal对象然后调用其print()函数,编译器将运行在“Principal”类中定义的函数。但是如果你没有在派生自“Teacher”类的类中定义print()函数,那么当你调用该类'对象指针的print()函数时,它将运行在“Teacher”中定义的print() “上课。

但是再次不要用对象本身来尝试这个,你应该用指针来做。

最好的问候。

答案 2 :(得分:0)

以下是您正在寻找的答案:obj属于C类,这意味着它既是A型又是B型。我试着注意当它是“is-a”时不要说“has-a”但是,在我看来,类型C的对象还有一个类型A和类型B的对象。当你调用类型C的构造函数时,你也会调用类型为A和B的构造函数。 所以,直到创建obj,一切都很好。但是,之后编译器必须决定调用两个show()中的哪一个。那就是它变得困惑的时候。

答案 3 :(得分:0)

您同时从类A和类B继承。这就是为什么它向您显示错误,即因为它是模棱两可的。要处理此问题,您可以显式引用在C的对象的调用对象时应调用的函数或方法。这样,编译器不会感到困惑,也不会向您显示任何错误。 代码:

class A{
   public: 
     void show(){ cout<<"Class A"; }
};
class B{
   public:
      void show(){  cout<<"Class B";  }
};
class C : public A , public B{
   public:
      void disp(){  A::show(); } // Here You can make explicit from which class the method
                               //  shall be called. I refer to method "show" from class A.
}
main(){
  C obj;
  obj.disp(); // Ambiguity in Multiple Inheritance Problem Solved

}