Наследование в C ++: передача подкласса функции, ожидающей базовый класс, и получение поведения подкласса - PullRequest
0 голосов
/ 23 октября 2018

В следующем примере с игрушкой у меня есть базовый класс и класс, который наследуется от него.Дочерний класс переопределяет метод doSomething().Однако, когда я передаю экземпляр дочернего класса в функцию, ожидающую базовый класс, я получаю поведение базового класса, то есть вывод будет I'm the base class!, а не I'm the child class!.Как я могу предотвратить это и почему это происходит (я полагаю, что происходит какое-то неявное приведение?).

Большое спасибо!

#include <iostream>

using namespace std;

class BaseClass {
public:
    void doSomething() {
        cout << "I'm the base class!";
    }
};

class SubClass : public BaseClass {
public:
    void doSomething() {
        cout << "I'm a child class!";
    }
};

void thisFunction(BaseClass & instance) {
    instance.doSomething();
}

int main(int, char*[]) {
    SubClass sc;
    thisFunction(sc);
}

1 Ответ

0 голосов
/ 23 октября 2018

Ваш BaseClass::doSomething() не является виртуальным.Таким образом, оно не может быть переопределено, а только затенено.Попробуйте изменить его подпись на

class BaseClass {
    virtual void doSomething() { /* ... */ }
};

Никаких изменений не требуется для SubClass, однако рекомендуется использовать ключевое слово override (ваш пример кода является прекрасной иллюстрацией для этого- пометка метода override заставляет компилятор жаловаться, если точно такая же сигнатура функции не virtual в любом базовом классе):

class SubClass : public BaseClass {
    void doSomething() override { /* ... */ }
};

В дополнение к этому, пожалуйста, сделайте BaseClassВиртуальный деструктор тоже (или protected), или вы рискуете неопределенным поведением при удалении экземпляра SubClass через указатель BaseClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...