切割(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往往以指针实现出来,因此传递引用通常意味着真正传递的是指针。

最新文章

  1. 用Log Parser Studio分析IIS日志
  2. [转] Java序列化与反序列化
  3. python 安装pillow
  4. INSERT INTO .. ON DUPLICATE KEY更新多行记录
  5. SQL SERVER分区表
  6. JS面向对象组件(一) ---包装对象与原型链
  7. HeadFirst设计模式之观察者模式
  8. JavaFX 开发是遇到一些问题记录
  9. 海量数据存储之Key-Value存储简介
  10. IT痴汉的工作现状16-职业发展
  11. 在SurfaceView中自由书写和擦除
  12. C++中内存泄漏的检测方法介绍
  13. noip 2016 提高组总结(不是题解)
  14. 高橋君とカード / Tak and Cards
  15. 【js实例】js中的5种基本数据类型和9种操作符
  16. hive学习03-求一年中的最大温度
  17. [转] js前端解决跨域问题的8种方案(最新最全)
  18. bypy 用法
  19. shell命令行执行python(解析json)
  20. DOS和批处理基本命令

热门文章

  1. node.js, node-debug, node-inspector, npm 等等的使用问题解决
  2. github 上 python 的优秀库推荐列表
  3. BGP Basic Knowledge
  4. Maven- 使用Maven构建一个可执行jar
  5. 模版抽离 优化url
  6. PHP/Yii2操作Cookie,常见问题以及注意事项
  7. mysql库安装
  8. $Java-json系列(二):用JSONObject解析和处理json数据
  9. $《第一行代码:Android》读书笔记——第2章 Activity
  10. [原创]spring及springmvc精简版--IOC