1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| enum class shape_type { circle, triangle, rectangle, ... };
class shape { ... }; class circle : public shape { ... }; class triangle : public shape { ... }; class rectangle : public shape { ... };
shape* create_shape(shape_type type) { ... switch (type) { case shape_type::circle: return new circle(...); case shape_type::triangle: return new triangle(...); case shape_type::rectangle: return new rectangle(...); ... } }
如上这种情况,只能返回指针或其他变体。如果返回类型是 shape,实际却返回一个 circle,编译器不会报错,但结果多半是错的。这种现象就是对象切片(object slicing),这种错误不是语法错误,而是一个对象复制相关的语义错误。
|