Nie można nadpisać funkcję składową bez niego.
Możesz tylko ukryć jeden.
struct Base {
void foo() {}
};
struct Derived : Base {
void foo() {}
};
Derived::foo
robi nie nadpisanie Base::foo
; to po prostu ukrywa go, ponieważ ma taką samą nazwę, taką, że:
Derived d;
d.foo();
wywołuje Derived::foo
.
virtual
umożliwia polimorfizm taki, że faktycznie funkcje ręczne:
struct Base {
virtual void foo() {}
};
struct Derived : Base {
virtual void foo() {} // * second `virtual` is optional, but clearest
};
Derived d;
Base& b = d;
b.foo();
To wywołuje Derived::foo
, bo to teraz nadpisaniaBase::foo
— Twój obiekt jest polimorficzny.
(też mieć używać odniesień i wskazówek na to, ze względu na the slicing problem.)
Derived::foo
nie trzeba powtarzać słowa kluczowego virtual
ponieważ Base::foo
już wykorzystane. Gwarantuje to standard i możesz na nim polegać. Jednak niektórzy uważają, że najlepiej zachować to dla jasności.
możliwy duplikat [C++ Virtual/Pure Virtual Explained] (http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained) –
@Harald: Nie. Inny temat. – Xeo
Ale pytam o użycie tego słowa kluczowego. Nie o abstrakcyjnej wirtualnej metodzie. – kravemir