显隐转换,虚成员和抽象成员

本文探讨了面向对象编程中父类与子类对象之间的引用规则。详细解释了为何不能将父类对象引用赋给子类,以及如何正确地让基类对象引用派生类对象。同时介绍了虚成员与抽象成员的概念及其应用。


问题:能否让子类对象引用父类对象?


不能把父类实例的引用赋给子类对象,或以内存形象的说,不能让子类对象指向父类实例

因为父类对象不包含子类成员,试想若能给这样做,请考虑下面的例子


Person 父类

Man 子类


Man  m=new Person;        //错

Person  p= new Person();

Man m=p;  //错


这时m想用 Man类的一些成员方法和属性,而想用的这些是Person类所没有的    怎么办?

就是说,你拿着男人的名义,想做一些男人能做的事情,可给你引用的是一个Person类,

结果是你做不了男人该做的事情


所以Man  m=new Person; 这种写法是错的    

换种说法,就是把人类转成男人类 (人是男人)

大的范畴转小的范畴,显然不可以

 若你非要这样任性的转换,最好前面这样 


Man  m=(Man)p;


这叫强制转换



问题:能否让基类对象引用派生类对象?

回答是可以的。由于派生类中包含从基类继承的成员,因此,在用到基类成员属性和方法的时候可以用其子类的成员代替。

在赋值时舍弃派生类自己的成员。也就是“大材小用”

1-14052F02521c6.png



Person  p= new Man();

Man m=new Man();

Person p=m;

这么写都是对的,这个过程会有自动的隐式转换


俗话说,凡是可以直接赋值的都是隐式,不能的就得强转才赋






请注意,赋值后不能企图通过父类对象p去访问子类对象m的成员,因为m的成员与p的成员是不同的。

假设age是类Man中增加的公用数据成员,分析下面的用法:

    p.age=23;  //错误,p中不包含派生类中增加的成员

    m.age=21;  //正确,m中包含派生类中增加的成员




虚成员和抽象成员




简单的理解

虚成员关键字virtual

虚函数可以被重写,基类中可以有实现体。

纯虚函数必须被重写,基类中只有定义没有实现体。


抽象成员关键字abstract

抽象函数基类没有实现,必须被覆写,使用override。



父类指针指向子类对象的时候,会执行子类中的方法。



比如一个动物类,和一个人类.

人继承于动物 ,动物是基类,里面有一个死亡方法,基类有自己的实现,人类里重写(override)了基类里的死亡方法,

动物也有其他子类,现在你想在一个kill方法中实现对所有子类死亡的控制,所以你只能用基类动物类型作为参数



kill方法要一个动物作为参数比如杀死某个动物  kill(animal _anm) {}  注意kill要的是animal对象,

kil(new People)


pPeople的对象,不过因为p继承于animal 所以可以传入kill方法里,为什么呢?

这时会完成一个隐式自动转换,animal _anm =new People;   此即是父类对象引用子类实例,按一种形象说法,父类指针指向子类实例

这样_anm就可以调用子类people的死亡方法了 _anm.dead()  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值