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