Унаследованная функция с использованием дочерней функции

#c #class #inheritance #polymorphism

#c #класс #наследование #полиморфизм

Вопрос:

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

 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. Вы, скорее всего, хотите посмотреть, что такое виртуальные функции…

Ответ №1:

Вам нужно сделать вашу функцию виртуальной, чтобы она 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;
    }
};
  

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