Перегрузка функций в проблеме множественного наследования в C ++ - PullRequest
1 голос
/ 28 апреля 2020

Это всего лишь вопрос о лучших практиках, которым необходимо следовать при перегрузке функций в задаче с алмазом при множественном наследовании.

#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 не могут быть изменены.

...