C++对象切割

 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 就表现出什么类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值