【C++】对象切割(对象切片)slicing problem

引出

在使用多态时,可能会发生由静态联编(静态绑定)导致的父类引用或指针调用子类重写方法,实际调用结果为父类中方法,但是静态联编可用使用虚函数来解决,从而恢复多态

静态绑定的方法调用在编译时就指定了其调用方法,此时就算是使用向上类型转换(子类的对象),受到调用的依旧是基类方法

多态是指:父类的引用或指针指向子类对象,从而使用一个基类下多个子类的重写方法

#include <iostream>
using namespace std;
//基类
class Base{
public:
	 void printError(){  //使用virtual关键字声明函数,将其变为虚函数,即可使用多态
	 cout << "基类方法!" << endl;
	 };
};
//派生类
class Derived : public Base{
public:
	 void printError(){
		cout << "派生类方法!" << endl;
	}
};
void test()
{	
	Base *ex = new Derived(); //静态联编导致子类对象调用基类方法,而不是子类方法
	ex->printError(); //输出基类方法!
}
int main()
{
   test();
   return 0;
}

对象切割

对象切割与静态联编相似,对象切割也会导致调用的方法变为基类方法,但对象切割并不是静态联编导致的,也不能通过虚函数解决

#include <iostream>
using namespace std;
//基类
class Base{
public:
	virtual void printError(){ //对象切片无法使用virtual关键字声明虚函数解决
	 cout << "基类方法!" << endl;
	 };
};
//派生类
class Derived : public Base{
public:
	 void printError(){
		cout << "派生类方法!" << endl;
	}
};
void test()
{	
	Base e = Derived(); //对象切片导致子类对象调用基类方法,而不是子类方法
	ex.printError(); //输出基类方法!
}
int main()
{
   test();
   return 0;
}

产生原因

当把一个派生类对象赋给一个基类对象时(并不是使用父类指针或引用接收子类对象),会发生对象切割。(另外用基类对象强制转换派生类对象也会)
在这里插入图片描述

接收值传递的返回值时,发生的拷贝构造也会发生对象切割
在这里插入图片描述
发生对象切片后派生类的覆盖部分就被切掉了,所以调用的方法将会是父类方法

静态联编与对象切片区别

在这里插入图片描述

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列队猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值