Все зависит от того, как вы вызываете метод. Учтите это:
AwesomePacket ap;
bool awesomeness0( ap.isAwesome()); // true, call is direct, not through vtable
AwesomePacket& rap( ap );
bool awesomeness1( rap.isAwesome()); // true, call is direct, not through vtable
Packet p( ap ); // WRONG (but legal): slicing child instance into space of parent
bool awesomeness2( p.isAwesome()); // false, call is direct, not through vtable
const Packet& rp( ap ); // the right way
bool awesomeness3( rp.isAwesome()); // true, call is through vtable
const Packet* pp( &ap ); // also the right way
bool awesomeness4( pp->isAwesome()); // true, call is through vtable
Это означает, что полиморфизм в C ++ работает только через ссылку или указатель на базу.
Редактировать:
Не забудьте добавить
виртуальный деструктор в базовый класс.
Редактировать:
Это также зависит от
, где вы вызываете свой виртуальный метод, см. Ответ
R Самуэль Клатчко .