Это всего лишь вопрос о лучших практиках, которым необходимо следовать при перегрузке функций в задаче с алмазом при множественном наследовании.
#include <iostream>
using namespace std;
class A {
public:
virtual void print() {
cout << "In A" << endl;
}
};
class B : public virtual A {
public:
virtual void print() {
A::print();
cout << "In B" << endl;
}
};
class C : public virtual A {
public:
virtual void print() {
A::print();
cout << "In C" << endl;
}
};
class D : public virtual B, public virtual C {
public:
virtual void print() {
B::print();
C::print();
cout << "In D" << endl;
}
};
Здесь базовый класс class A
реализует перегруженную функцию print()
в производных классах class B
и class C
. Однако для производных классов class B
и class C
также требуется функция базового класса print()
, поэтому они обращаются к функции базового класса print()
с использованием A::print()
.
A a;
B b;
C c;
a.print();
Выход:
In A
b.print();
Выход:
In A
In B
c.print();
Выход:
In A
In C
class D
является производным от class B
и class C
.
class D
также необходимо перегрузить функцию print()
и вызвать все функции печати ее родительских классов class B
и class C
, а также класса прародителя class A
.
Использование B::print(); C::print();
в перегруженной функции print()
class D
:
d.print();
Выход:
In A
In B
In A
In C
In D
, что ожидается, так как перегруженные функции print()
в class B
и class C
оба имеют вызовы A::print()
.
Как лучше перегрузить функцию print()
в class D
, чтобы:
d.print();
Вывод:
In A
In B
In C
In D
, учитывая, что классы class A
, class B
и class C
не могут быть изменены.