本帖最后由 徐帅 于 2013-1-7 10:00 编辑
多态中(父类引用指向子类对象)成员的特点
1 非静态成员函数的特点:(因为存在覆盖)
1> 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有,编译失败。
2> 在运行时期:参阅对象所属的类中是否有调用的方法。
(动态绑定:this所指对象去调用方法)
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。
2. 成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)。
3. 静态成员函数的特点:无论编译和运行,都参考做左边。
(静态绑定:静态方法一进内存就绑定在其所属类上了,所属于类)
原因:静态方法不需要对象,其决定于引用变量的所属类,所以一般不会覆盖静态方法。
我们首先要明白多态的前提: 必须是类与类之间有关系。要么继承,要么实现。 通常还有一个前提:存在覆盖。
对于楼主的问题,问题的关键是
静态成员所属于类,静态方法调用不需要对象,一般也不会去覆盖,编译器能够直接发现这个类是否有方法,因为静态一加载就进内存了,
而非静态成员需要对象去调用。
非静态成员调用时:
编译期:如果父类都没有这个方法,又如何谈得上覆盖呢,因为只有运行时才知道是否进行了覆盖,而编译器无法知道,所以当父类中没有该方法时,
为了安全起见,编译器就认为错误。
在运行时期:由于是动态绑定,this所指对象去调用方法,当然运行子类所覆盖的方法了,所以运行时看子类。
不知道理解得对不对,希望各位拍砖
|