Страницы

Поиск по вопросам

вторник, 8 января 2019 г.

Как при ромбовидном наследовании удалить метод базового класса в одной из веток так что бы он остался виден в конечном наследнике?

Есть класс FooBase у которого есть метод FunBase(). От этого класса через виртуальное наследование наследуются два класса FooA и FooB. В FooB метод FunBase() удаляется т. к. его там по логике программы быть не может. От этих двух классов наследуется класс FooEnd в котором метод FunBase() должен быть. Как изменить код так что бы у объекта FooEnd стал возможен вызов метода FunBase() без использования агрегации.
using std::cout; using std::endl;
class FooBase { public: void FunBase() { cout << "FunBase" << endl; } };
class FooA: virtual public FooBase { public: void FunA() { cout << "FunA" << endl; } };
class FooB: virtual public FooBase { public: void FunB() { cout << "FunB" << endl; } void FunBase() = delete;
};
class FooEnd: public FooA, public FooB { public: void FunEnd() { cout << "FunEnd" << endl; } };
int main() { FooEnd bat; bat.FunBase(); return 0; }
Под агрегациея я понимаю запись вида:
class FooEnd: public FooA, public FooB { public: void FunEnd() { cout << "FunEnd" << endl; } void FunBase() { FooBase::FunBase(); }; };


Ответ

Можно сделать так:
class FooB: virtual public FooBase { public: void FunB() { cout << "FunB" << endl; } protected: using FooBase::FunBase; };
class FooEnd: public FooA, public FooB { public: void FunEnd() { cout << "FunEnd" << endl; } using FooBase::FunBase; };
P.S. я считаю, что если появилось такое желание, то что-то не так в дизайне классов, поэтому рекомендую всё же подумать, как сделать это по-человечски.

Комментариев нет:

Отправить комментарий