#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;
}
};
Другой хорошей практикой также является предусмотреть виртуальный деструктор в базовом классе.