浅谈C++中多态与java中多态机制
2014-04-19 21:27
483 查看
所谓的多态即用父类型的指针指向子类对象,然后通过父类的指针调用实际之类的成员函数,因此父类的指针具有多
种形态。多态性可以简单地概括为“一个接口,多种方法”,也可以说所是动态绑定。程序在运行时才决定调用的函
数,它是面向对象编程领域的核心概念。
c++的多态必须通过虚函数来实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖。
(在C++中重写虚函数才算是体现了多态性)。例如
Base*p=new Derived;p->Fun();(此处将调用父类的Fun方法,p的访问权限为Base的权限)
这才称之为多态。p是一个Base类型的引用,指向了Derived的一个实例化对象。
而派生类的虚函数必须所和基类的虚函数声明是一致的。因为多态是在程序员没有指定调用父类还是某个子类的成员
函数时,电脑根据程序员的要求,揣测并选择最合适的成员函数去执行。但是当成员函数的参数格式不同时,程序员
在调用成员函数的各种参数无疑就是在暗示到底调用哪个成员函数。这时电脑岂敢自作主张揣测人类的心思?因此,
要使用虚函数实现多态性,至少要使各个函数的参数格式也完全相同。关于这一点可以参
考http://blog.csdn.net/asdfghjkl1993/article/details/24137125
总结C++多态性的条件:
1:基类的虚函数。
2:派生类的虚函数必须和基类的虚函数声明一致(包括参数类型,返回值类)
3:类的成员函数才可以说明成虚函数(一般函数不行)。静态成员函数不受制于某个对象,不能说明成虚函数。内联
函数不能在运行中动态确定。构造函数因为负责构造对象,所以也不能是虚函数。而析构函数一般是虚函数。
对于析构函数一般都是虚函数的解释:
4:指针,或者引用才能实现多态
例:
第一个p->foo()和p->fuu()都很好理解,本身是基类指针,指向的又是基类对象,调用的都是基类本身的函数。
第二个p->foo()和p->fuu()则是基类指针指向子类对象,正式体现多态的用法,p->foo()由于指针是个基类指针,指
向是一个固定偏移量的函数,因此此时指向的就只能是基类的foo()函数的代码了。而p->fuu()指针是基类指针,指向
的fuu是一个虚函数,由于每个虚函数都有一个虚函数列表,此时p调用fuu()并不是直接调用函数,而是通过虚函数列
表找到相应的函数的地址,因此根据指向的对象不同,函数地址也将不同,这里将找到对应的子类的fuu()函数的地
址。
JAVA中多态则不一定需要用到虚函数。它所要求的是父类引用指向子类对象。 当使用多态方式调用方法时,首先检
查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同
形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换。因为当用父类的引用指向子类的对象,用父类
引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。
例
多态示例代码
运行结果:
Catis singing!
Catis singing!
Catis eating!
种形态。多态性可以简单地概括为“一个接口,多种方法”,也可以说所是动态绑定。程序在运行时才决定调用的函
数,它是面向对象编程领域的核心概念。
c++的多态必须通过虚函数来实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖。
(在C++中重写虚函数才算是体现了多态性)。例如
Base*p=new Derived;p->Fun();(此处将调用父类的Fun方法,p的访问权限为Base的权限)
这才称之为多态。p是一个Base类型的引用,指向了Derived的一个实例化对象。
而派生类的虚函数必须所和基类的虚函数声明是一致的。因为多态是在程序员没有指定调用父类还是某个子类的成员
函数时,电脑根据程序员的要求,揣测并选择最合适的成员函数去执行。但是当成员函数的参数格式不同时,程序员
在调用成员函数的各种参数无疑就是在暗示到底调用哪个成员函数。这时电脑岂敢自作主张揣测人类的心思?因此,
要使用虚函数实现多态性,至少要使各个函数的参数格式也完全相同。关于这一点可以参
考http://blog.csdn.net/asdfghjkl1993/article/details/24137125
总结C++多态性的条件:
1:基类的虚函数。
2:派生类的虚函数必须和基类的虚函数声明一致(包括参数类型,返回值类)
3:类的成员函数才可以说明成虚函数(一般函数不行)。静态成员函数不受制于某个对象,不能说明成虚函数。内联
函数不能在运行中动态确定。构造函数因为负责构造对象,所以也不能是虚函数。而析构函数一般是虚函数。
对于析构函数一般都是虚函数的解释:
4:指针,或者引用才能实现多态
例:
#include<iostream> usingnamespace std; classA { public: voidfoo() { cout<<"A::functionfoo"<<endl; } virtualvoid fuu() { cout<<"A::functionfuu"<<endl; } }; classB:public A { public: voidfoo() { cout<<"B::functionfoo"<<endl; } voidfuu() { cout<<"B::functionfuu"<<endl; } }; intmain() { Aa; Bb; A*p = &a; p->foo(); p->fuu(); p= &b; p->foo(); p->fuu(); return0; }
第一个p->foo()和p->fuu()都很好理解,本身是基类指针,指向的又是基类对象,调用的都是基类本身的函数。
第二个p->foo()和p->fuu()则是基类指针指向子类对象,正式体现多态的用法,p->foo()由于指针是个基类指针,指
向是一个固定偏移量的函数,因此此时指向的就只能是基类的foo()函数的代码了。而p->fuu()指针是基类指针,指向
的fuu是一个虚函数,由于每个虚函数都有一个虚函数列表,此时p调用fuu()并不是直接调用函数,而是通过虚函数列
表找到相应的函数的地址,因此根据指向的对象不同,函数地址也将不同,这里将找到对应的子类的fuu()函数的地
址。
JAVA中多态则不一定需要用到虚函数。它所要求的是父类引用指向子类对象。 当使用多态方式调用方法时,首先检
查父类中是否有该方法,如果没有,则编译错误;
如果有,再去调用子类的该同名方法。
(注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同
形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)
如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换。因为当用父类的引用指向子类的对象,用父类
引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。
例
多态示例代码
public class PolyTest { publicstatic void main(String[] args) { //向上类型转换 Catcat = new Cat(); Animalanimal = cat; animal.sing(); //向下类型转换 Animala = new Cat(); Catc = (Cat)a; c.sing(); c.eat(); //编译错误 //用父类引用调用父类不存在的方法 //Animala1 = new Cat(); //a1.eat(); //编译错误 //向下类型转换时只能转向指向的对象类型 //Animala2 = new Cat(); //Catc2 = (Dog)a2; } } classAnimal { publicvoid sing() { System.out.println("Animalis singing!"); } } classDog extends Animal { publicvoid sing() { System.out.println("Dogis singing!"); } } classCat extends Animal { publicvoid sing() { System.out.println("Catis singing!"); } publicvoid eat() { System.out.println("Catis eating!"); } }
运行结果:
Catis singing!
Catis singing!
Catis eating!
相关文章推荐
- C++与Java中多态实现机制的区别
- 浅谈C++/JAVA/C#运行机制和执行效率
- 浅谈C++/JAVA/C#运行机制和执行效率
- 浅谈java的多态机制
- 浅谈C++/JAVA/C#运行机制和执行效率
- Java和C++访问权限以及多态机制的一些区别
- c++和Java的多态机制
- 浅谈C++/JAVA/C#运行机制和执行效率
- C++和java中多态机制的异同
- java 和C++ 多态机制区别
- 浅谈C++/JAVA/C#运行机制和执行效率
- java c++ 实现多态(polymorphism)的机制
- C++和java中多态机制的异同
- C++和java中多态机制的异同
- 浅谈Java中的通信机制及与C/C++ API的集成
- C++和java中多态机制的异同(zz)
- C++ 多态的实现机制
- C++多态的实现机制深入理解
- C++ JAVA下回调函数机制和原理比较分析
- c++ && JAVA 的资源回收机制-对比