Avatar ·

什么是C++中的对象切片(object slicing)以及如何避免?

你好!我正在学习C++,遇到了一个我无法理解的问题。我有一个基类`Shape`和一个派生类`Circle`。当我将一个`Circle`对象传递给一个按值接受`Shape`的函数时,我丢失了`Circle`特有的数据和行为。例如: ```cpp #include #include class Shape { public: virtual void draw() const { std::cout << "Drawing Shape\n"; } }; class Circle : public Shape { public: void draw() const override { std::cout << "Drawing Circle\n"; } double radius = 5.0; }; void printShape(Shape s) { // 按值接受 s.draw(); // std::cout << s.radius; // 错误!radius不在Shape中 } int main() { Circle c; printShape(c); // 输出"Drawing Shape",而不是"Drawing Circle"! return 0; } ``` 我期望`draw()`会调用`Circle`的版本,但实际调用的是`Shape`的版本。此外,我无法访问`radius`。在网上这被称为"对象切片(object slicing)"。