У меня есть следующая тестовая программа
#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() {
^
Даже я использую виртуальное наследование здесь. Любое решение этого?
Там нет необходимости virtual
Ключевое слово здесь, классы Student
а также Faculty
не связаны через наследование от общего класса.
Если вы хотите, чтобы конкретный метод использовался в TA
вы можете положить using Student::test;
или же using Faculty::test;
внутри TA
объявление класса.
Я надеюсь, что этот пример появился из чисто образовательных целей, потому что, если он используется / планируется использовать в реальном приложении — это признак того, что что-то не так с дизайном 🙂
У вас просто есть два test()
методы в вашем TA
класс, унаследованный от Faculty
другой из Student
и компилятор правильно сообщает, что не может решить, какой из них вы хотите вызвать.
Вам нужно решить это, либо явно указав, какой метод вы хотите вызвать:
TA ta1(30);
ta1.Faculty::test();
или как объект должен быть обработан (и это будет подразумевать, какой метод вызывать):
((Faculty &)ta1).test();