?C++以by value方式传递参数容易造成对象切割问题。当一个子类对象以by value方式传递并被视为父类对象,父类的copy构造函数会被调用,而“造成此对象的行为像个子类对象”的那些特化性质全被切割了,仅仅留下一个父类对象。假设你在一组classes上工作,用来实现一个图形窗口系统:
class Window {
public:
...
std::string name() const;
virtual void display() const;
}
class WindowWithScrollBars: public Window {
virtual void display() const;
}
?display 是个虚函数,父类 Window 对象的显示方式和子类 WindowScrollBars 的显示方式不同。假设你希望打印窗口名称并显示该窗口:
void printNameAndDisplay(Window w) {
? ?std::cout<<w.name();
? ?w.display();
}
?当你调用上述函数并传递一个 WindowWithScrollBars 对象:
WindowWithScrollBars wwsb;
printNameAndDisplay(wwsb);
?参数 w 会被构造为一个 Window 对象。造成 wwsb “之所以是个WindowScrollBars 对象” 的所有特化信息都被切除。在 printNameAndDisplay 函数内无论传递过来的对象原本是父类还是子类,参数 w 都会被构造为 Window 对象(父类的 copy 构造函数被调用)。
? 以 by reference-to-const 的方式传递参数可以避免对象切割:
void printNameAndDisplay(Window& w) {
? ?std::cout<<w.name();
? ?w.display();
}
?现在,传进来的是什么类型,w 就表现出什么类型
|