Могут ли несколько базовых классов иметь один и тот же виртуальный метод?
- Может ли это случиться?
Да.
Таким образом, метод read () на самом деле вызвал бы чтение класса B ()
Это не происходит автоматически. Функция-член base не переопределяет функцию несвязанной базы.
Вы можете добавить переопределение к C
:
class C : public A, public B {
int get_data() override;
}
Это переопределяет и A::get_data
и B::get_data
. Чтобы "на самом деле вызвать read класса B ()" , вы действительно можете сделать такой вызов:
int C::get_data() {
return B::get_data();
}
Или ... это было бы возможно, если бы вы не объявили B::get_data
личным.
Переопределение функции в другой базе без явного делегирования в производном возможно , если вы немного измените свою иерархию. В частности, вам нужна общая база и виртуальное наследование:
struct Base {
virtual int get_data() = 0;
};
struct A : virtual Base {
void print() {
std::cout << get_data();
}
};
struct B : virtual Base {
int get_data() override {
return 4;
}
};
struct C : A, B {};