Унаследованная функция с использованием дочерней функции - PullRequest
1 голос
/ 25 марта 2019

Я искал, чтобы иметь базовый класс и несколько дочерних классов, каждый с отдельной реализацией одной функции, используемой во многих общих функциях.Это было бы похоже на это

class A {
    public:
    int a() {
        return 6;
    }
    int b() {
        return a() - 2;
    }
};

class B: public A {
    public:
    int a() {
        return 10;
    }
};

int main() {
    B x;
    std::cout << x.b() << std::endl;
}

Как бы я получил x.b(), чтобы быть 8 вместо 4?

1 Ответ

2 голосов
/ 25 марта 2019

Вам нужно сделать вашу функцию виртуальной, чтобы a() всегда ссылался на реализацию a() в реальном классе объекта:

class A {
    public:
    virtual int a() {         //<<<<<<<<--------
        return 6;
    }
    int b() {
        return a() - 2;
    }
    virtual ~A() = default;  
};

В вашей версии с не виртуальной функцией тело b() вызывает единственный известный ему a(), то есть A::a().

В качестве хорошей практики и во избежание неприятных ошибок при определении виртуальной функции в производных классах укажите, что вы переопределяете виртуальную функцию:

class B: public A {
    public:
    int a() override {
        return 10;
    }
};

Еще одна хорошая практика - предусмотреть виртуальный деструктор в базовом классе.

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