Унаследованный виртуальный метод C ++ все еще использует реализацию базового класса - PullRequest
2 голосов
/ 21 января 2010

У меня есть базовый класс с именем Packet:

// Header File
class Packet {
public:
    virtual bool isAwesome() const {
        return false;
    }
}

и унаследованный класс с именем AwesomePacket:

// Header File
class AwesomePacket : public Packet {
public:
    virtual bool isAwesome() const {
        return true;
    }
}

Однако, когда я создаю экземпляр AwesomePacket и вызываю isAwesome(), метод возвращает false вместо true. Почему это так?

Ответы [ 2 ]

8 голосов
/ 22 января 2010

Случайно ваш код вызывает isAwesome в конструкторе Packet:

Packet::Packet()
{
    // this will always call Packet::isAwesome
    if (isAwesome())
    {
    } 
}

Даже если этот конструктор Packet используется для создания родительского объекта объекта AwesomePacket, это не вызовет AwesomePacket :: isAwesome. Это связано с тем, что на данный момент объект еще не является AwesomePacket.

4 голосов
/ 21 января 2010

Все зависит от того, как вы вызываете метод. Учтите это:

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 Самуэль Клатчко .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...