наследование — Как решить проблему алмазов в C ++?

У меня есть следующая тестовая программа

#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() {
^

Даже я использую виртуальное наследование здесь. Любое решение этого?

-3

Решение

Там нет необходимости virtual Ключевое слово здесь, классы Student а также Faculty не связаны через наследование от общего класса.

Если вы хотите, чтобы конкретный метод использовался в TA вы можете положить using Student::test; или же using Faculty::test; внутри TA объявление класса.

Я надеюсь, что этот пример появился из чисто образовательных целей, потому что, если он используется / планируется использовать в реальном приложении — это признак того, что что-то не так с дизайном 🙂

2

Другие решения

У вас просто есть два test() методы в вашем TA класс, унаследованный от Facultyдругой из Studentи компилятор правильно сообщает, что не может решить, какой из них вы хотите вызвать.

Вам нужно решить это, либо явно указав, какой метод вы хотите вызвать:

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

или как объект должен быть обработан (и это будет подразумевать, какой метод вызывать):

((Faculty &)ta1).test();
0

По вопросам рекламы [email protected]