切片简单问题

#include<iostream>
#include<string>

using namespace std;
class Pet
{
public:
	virtual void print();
	string name;
};
class Dog:public Pet
{
public:
	virtual void print();
	string breed;    //breed 代表狗的种类;
};
int main()
{
	Dog vdog;
	Pet vpet;
	vdog.name="tiny";
	vdog.breed="great dane";
	vpet=vdog;
//vpet.breed 是非法的因为pet没有breed 成员 
Dog *pdog;
pdog=new Dog;
pdog->name="tiny";
pdog->breed="great dane";

Pet *ppet;
ppet=pdog;
pdog->print();
ppet->print();
//两个打印的是相同的输出
//以下语句直接访问成员变量,而不是通过虚函数,所以会出错
//cout<<"name:"<<ppet->name<<"breed:"<<ppet->breed<<endl;
return 0;
}
void Dog::print()
{
	cout<<"name:"<<name<<endl;
	cout<<"breed:"<<breed<<endl;
}
void Pet::print()
{
	cout<<"name:"<<name<<endl;
}

虽然将一个派生类对象赋给一个基类对象是合法的,但是将一个派生类对象赋给基类时会产生切片问题,部分数据会被切掉。。在派生类中任何基类中没有的数据会在赋值中丢失,基类中未定义的任何成员函数都会丢失,倒是最终生成的基类对象无法使用它们。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值