Classes and class hierarchies
C.145
Обращайтесь к полиморфным объектам через указатели и ссылки
Причина
Если у вас есть класс с виртуальной функцией, вы (в общем случае) не знаете, какой класс предоставил используемую функцию.
Пример
struct B { int a; virtual int f(); virtual ~B() = default };
struct D : B { int b; int f() override; };
void use(B b)
{
D d;
B b2 = d; // срезание
B b3 = b;
}
void use2()
{
D d;
use(d); // срезание
}
Оба объекта d подвергаются срезанию.
Исключение
Вы можете безопасно обращаться к именованному полиморфному объекту в области его определения — просто не срезайте его.
void use3()
{
D d;
d.f(); // OK
}
Смотрите также
Полиморфный класс должен подавлять копирование
Контроль
Помечать всё срезание.