问题:能否让子类对象引用父类对象?
不能把父类实例的引用赋给子类对象,或以内存形象的说,不能让子类对象指向父类实例
因为父类对象不包含子类成员,试想若能给这样做,请考虑下面的例子
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;
这叫强制转换
问题:能否让基类对象引用派生类对象?
回答是可以的。由于派生类中包含从基类继承的成员,因此,在用到基类成员属性和方法的时候可以用其子类的成员代替。
在赋值时舍弃派生类自己的成员。也就是“大材小用”
如
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)
p是People的对象,不过因为p继承于animal 所以可以传入kill方法里,为什么呢?
这时会完成一个隐式自动转换,animal _anm =new People; 此即是父类对象引用子类实例,按一种形象说法,父类指针指向子类实例
这样_anm就可以调用子类people的死亡方法了 _anm.dead()
本文探讨了面向对象编程中父类与子类对象之间的引用规则。详细解释了为何不能将父类对象引用赋给子类,以及如何正确地让基类对象引用派生类对象。同时介绍了虚成员与抽象成员的概念及其应用。

7310

被折叠的 条评论
为什么被折叠?



