Вы не можете переопределить функцию-член без него.
Вы можете только скрыть один.
struct Base {
void foo() {}
};
struct Derived : Base {
void foo() {}
};
Derived::foo
делает не переопределение Base::foo
; он просто скрывает , потому что она имеет такое же имя, такое, что следующее:
Derived d;
d.foo();
вызывающую Derived::foo
.
virtual
позволяет полиморфизм такое, что вы на самом деле переопределения функции:
struct Base {
virtual void foo() {}
};
struct Derived : Base {
virtual void foo() {} // * second `virtual` is optional, but clearest
};
Derived d;
Base& b = d;
b.foo();
Это вызывает Derived::foo
, потому что это сейчас переопределяетBase::foo
— ваш объект является полиморфным.
(Вы также есть использовать ссылки или указатели на это, из-за the slicing problem.)
Derived::foo
не нужно повторять virtual
ключевое слово, потому что Base::foo
уже использовал его. Это гарантируется стандартом, и вы можете положиться на него. Тем не менее, некоторые считают, что лучше всего сохранить это для ясности.
возможно дубликат [C++ Virtual/Pure Virtual Разъяснения] (http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained) –
@Harald: Нет. Разная тема. – Xeo
Но я спрашиваю об использовании этого ключевого слова. Не об абстрактном виртуальном методе. – kravemir