Non è possibile sostituire una funzione membro senza di essa.
È possibile solo nascondere uno.
struct Base {
void foo() {}
};
struct Derived : Base {
void foo() {}
};
Derived::foo
fa non di override Base::foo
; semplicemente nasconde perché ha lo stesso nome, in modo tale che la seguente:
Derived d;
d.foo();
invoca Derived::foo
.
virtual
consente il polimorfismo tale che si realtà funzioni di override:
struct Base {
virtual void foo() {}
};
struct Derived : Base {
virtual void foo() {} // * second `virtual` is optional, but clearest
};
Derived d;
Base& b = d;
b.foo();
Questo richiama Derived::foo
, perché questo ora overrideBase::foo
— l'oggetto è polimorfico.
(È inoltre necessario da usare riferimenti o puntatori per questo, a causa di the slicing problem.)
Derived::foo
non ha bisogno di ripetere la parola virtual
perché Base::foo
ha già usato. Questo è garantito dallo standard e puoi fare affidamento su di esso. Tuttavia, alcuni pensano che sia meglio tenerlo per chiarezza.
fonte
2011-06-18 16:38:14
possibile duplicato del [C++ virtuale/virtuale pura Spiegato] (http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained) –
@Harald: Nope. Argomento diverso – Xeo
Ma sto chiedendo sull'utilizzo di quella parola chiave. Non riguardo al metodo virtuale astratto. – kravemir