Страницы

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

среда, 1 января 2020 г.

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

#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. я считаю, что если появилось такое желание, то что-то не так в дизайне классов, поэтому рекомендую всё же подумать, как сделать это по-человечски.

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

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