#cpp #наследование #cpp17
Есть класс 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(); }; };
Ответы
Ответ 1
Можно сделать так: 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. я считаю, что если появилось такое желание, то что-то не так в дизайне классов, поэтому рекомендую всё же подумать, как сделать это по-человечски.
Комментариев нет:
Отправить комментарий