Ваш BaseClass::doSomething()
не является виртуальным.Таким образом, оно не может быть переопределено, а только затенено.Попробуйте изменить его подпись на
class BaseClass {
virtual void doSomething() { /* ... */ }
};
Никаких изменений не требуется для SubClass
, однако рекомендуется использовать ключевое слово override
(ваш пример кода является прекрасной иллюстрацией для этого- пометка метода override
заставляет компилятор жаловаться, если точно такая же сигнатура функции не virtual
в любом базовом классе):
class SubClass : public BaseClass {
void doSomething() override { /* ... */ }
};
В дополнение к этому, пожалуйста, сделайте BaseClass
Виртуальный деструктор тоже (или protected
), или вы рискуете неопределенным поведением при удалении экземпляра SubClass
через указатель BaseClass
.