Я расширяю класс, предоставляемый библиотекой третьей части. Класс, назовем его Foo
, имеет метод reset ()
, который можно вызвать для перезапуска поведения Foo
. Метод reset ()
также используется внутри класса.
class Foo
{
public:
void reset () {
/* ... */
}
void something () {
reset();
}
};
Пока что мне нужно перегрузить метод reset ()
, чтобы также сбросить мои дополнительные функции:
class Bar : public Foo
{
public:
void reset() {
/* ...something... */
Foo::reset();
}
};
К сожалению, поскольку метод Foo :: reset ()
не виртуальный, вызывая Bar :: something ()
, я получаю Foo :: reset () Метод
вызывается вместо Bar :: reset ()
.
Есть ли способ (отличный от перегрузки Foo :: something ()
), чтобы вернуть его назад -virtual?
Вы не можете расширять классы, которые не предназначены для расширения.
Вы не можете сделать reset()
виртуальным в своей библиотеке таким образом, чтобы он влиял на базовый класс без изменения кода базового класса. Во-первых, компилятор не добавил необходимый бухгалтерский код, позволяющий выполнять виртуальные вызовы reset()
.