Срезка и расщепление
Срезка[Страуструп] или расщепление [Брюс Эккель] - неправильное использование преобразования типа производного класса, в результате чего происходит “срезка” типа и содержимого производного класса до содержимого базового класса.
Рассмотрим класс Point2d являющийся базовым для Point3d. В следующем примере происходит срезка объекта :
Point3d b;
Point2d a1 = b; //срезка!!
Чтобы срезки не происходило, необходимо не использовать передачу параметра по значению(как в примере), т.к. в этом случае вызывается конструктор копирования для базового класса(в этом и заключается причина срезки). Правильнее передавать параметры по ссылке или по указателю.
Более развернутый пример, иллюстрирующий срезку :
#include <iostream>
using std::cout;
struct Point {
int x;
int y;
Point (int x_ = 0, int y_ = 0):
x(x_), y(y_) { }
};
struct Point2d {
Point one;
Point two;
virtual void foo () { cout << "foo" << endl; }
};
struct Point3d : Point2d {
Point three;
void foo () {
cout << "!!foo" << three.x << "|" << three.y << endl;
}
Point3d() :
three(10, 20)
{}
};
int main() {
Point3d b;
b.foo();
Point2d a1 = b; //здесь произойдет срезка!!
a1.foo();
Point2d& a = b;
a.foo();
Point2d* a2 = &b;
a2->foo();
}