#include <iostream>
class A {
public:
void foo() {
std::cout << 'A';
}
virtual void virtual_foo() {
std::cout << 'A';
}
virtual ~A() = default; // Если в классе есть хотя бы один виртуальный метод, то рекомендуется делать и виртуальный деструктор
};
class B : public A {
public:
void foo() {
std::cout << 'B';
}
void virtual_foo() override {
std::cout << 'B';
}
};
int main(){
A* a = new A();
B* b = new B();
A* bb = b; // Тот же объект класса B, но указатель приведен к другому типу
a->foo(); // A
b->foo(); // B
bb->foo(); // A - метод определяется типом указателя/ссылки в процессе компиляции
std::cout << '\n';
a->virtual_foo(); // A
b->virtual_foo(); // B
bb->virtual_foo(); // B - метод определяется "настоящим" типом объекта в рантайме
// Здесь утечка памяти
return 0;
}