-2

我有以下测试程序

#include<iostream>
using namespace std;


class Faculty {
// data members of Faculty
public:
    Faculty(int x) {
    cout<<"Faculty::Faculty(int ) called"<< endl;
    }
    void test() {
        cout<<"Faculty::test called" << endl;
    }
};

class Student  {
// data members of Student
public:
    Student(int x) {
        cout<<"Student::Student(int ) called"<< endl;
    }
    void test() {
        cout<<"Student::test called" << endl;
    }
};

class TA : virtual public Faculty, virtual public Student {
public:
    TA(int x):Student(x), Faculty(x) {
        cout<<"TA::TA(int ) called"<< endl;
    }
};

int main() {
    TA ta1(30);
    ta1.test();
}

编译期间出现错误

8be257447d8c26ef785b1a60f2884a.cpp: In function 'int main()':
748be257447d8c26ef785b1a60f2884a.cpp:36:6: error: request for member 'test' is ambiguous
  ta1.test();
      ^
748be257447d8c26ef785b1a60f2884a.cpp:22:7: note: candidates are: void Student::test()
  void test() {
       ^
748be257447d8c26ef785b1a60f2884a.cpp:11:7: note:                 void Faculty::test()
  void test() {
       ^ 

即使我在这里使用虚拟继承。有什么解决办法吗?

4

2 回答 2

2

这里不需要virtual关键字,类StudentFaculty并且不通过从公共类继承来关联。

如果你想使用特定的方法,TA你可以把using Student::test;using Faculty::test;放在TA类声明中。

我希望这个例子是出于纯粹的教育目的,因为如果它被使用/计划用于实际应用——这表明设计出了问题:)

于 2017-07-26T06:31:41.263 回答
0

您的类中只有两种test()方法TA,一种是从 继承Faculty,另一种是从Student,编译器会正确通知您它无法决定要调用哪个方法。

您需要通过明确说明要调用的方法来解决该问题:

TA ta1(30);
ta1.Faculty::test();

或者应该如何处理对象(这将暗示要调用哪个方法):

((Faculty &)ta1).test();
于 2017-07-26T06:46:39.743 回答