基类对象对派生类对象的切割问题

本文探讨了派生类对象以值传递方式时如何被切割为基类对象,并解释了通过引用传递常量避免该问题的方法。通过具体代码示例展示了派生类特性的丢失及其解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * *基类对象对派生类对象的切割问题* *
 程序输出:
 By_Value_Display :Window.display
 By_Reference_Display :WindowWithScrollBars.display
 知识点:
 *当一个derived class 对象以by value 方式传递并被视为一个base class 对象,base class 的拷贝构造函数
 *会被调用,而“造成此对象的行为像个derived class 对象”的那些特化性质全被切割掉了,仅仅留下一个
 *base class 对象,因为正是base class 构造函数建立了它。
 *避免切割问题,可用 pass-by-reference-to-const 代替 pass-by-value。
*/
#include <iostream>
using namespace std;


class Window
{
public:
 virtual void display() const { cout << "Window.display" << endl; };
};

class WindowWithScrollBars: public Window
{
public:
 virtual void display() const { cout << "WindowWithScrollBars.display" << endl; };
};

void By_Value_Display(Window w)
{
 w.display();
}

void By_Reference_Display(const Window& w)
{
 w.display();
}

int main()
{
 //调用
 WindowWithScrollBars wwsb;
 cout << "By_Value_Display :";
 By_Value_Display(wwsb);
 cout << "By_Reference_Display :";
 By_Reference_Display(wwsb);

 getchar();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值