什么是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)"。