切割(slicing)问题
请看下面代码:
class Window { public: ... std::string name()const; //返回窗口名称 virtual void display()const; //显示窗口和其内容 }; class WindowWithScrollBars:public Window { public: ... virtual void display()const; };
现在假设你希望写个函数打印窗口名称,然后显示该窗口,代码如下所示:
void printNameAndDisplay(Window w)//不正确,参数可能被切割 { std::cout << w.name(); w.display(); } WindowWithScrollBars wwsb; printNameAndDisplay(wwsb);//将调用Window::display();
在调用printNameAndDisplay函数时,参数永远都会被构造成一个Window对象。
解决的办法是以常引用的方式传递w:
void printNameAndDisplay(const Window& w) { std::cout << w.name(); w.display(); } WindowWithScrollBars wwsb; printNameAndDisplay(wwsb);//将调用WindowWithScrollBars::display();
因为references往往以指针实现出来,因此传递引用通常意味着真正传递的是指针。