java与c++在虚函数方面的异同
2014-07-29 15:56
169 查看
java与C++的虚函数比较java与C++的虚函数比较
运行结果:base
----------------------------------------------------------------------------
c++例子
运行结果:
derived
----------------------------------------------------------------
如果将上面J***A中的private改为public, 则运行结果为derived
c++
虚函数
1.定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数 [1]
2.语法:virtual 函数返回类型 函数名(参数表) { 函数体 }
3.用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数,也就是允许子类override父类同名方法。
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(也就是完全相同的方法,不能只是函数名相同。)。以实现统一的接口,不同的定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。虚函数是C++多态的一种表现。动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:
1.指向基类的指针变量名->虚函数名(实参表)
2.基类对象的引用名. 虚函数名(实参表)
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual 函数名=0 ,例如:virtual void fun() = 0,我们把这样的函数(方法)称为纯虚函数。如果一个类包含了纯虚函数,称此类为抽象类。
总结:如果一个子类想要重写父类的方法,那么父类的这个成员方法必须是virtual的,也就是这个方法必须是虚函数。
java
在java中,所有方法默认就是虚拟的,只要方法不是声明为final类型的,那么肯定就是虚函数,不用为方法显示声明为virtual。在<core java2 :volum I>中提到:"In Java, you do not need to declare a method as virtual. Dynamic binding is the default behavior. If you do not want a method to be virtual, you tag
it as final"。所以我们发现,在java中,子类可以重写(override)父类的方法,而父类没有声明virtual。
通过上面的例子, 应该可以看出C++与J***A的虚函数异同点.
网上还有人把这二者的总结用下面的对比描述了一下:
C++ Java
虚函数 -------- 普通函数
纯虚函数 -------- 抽象函数
抽象类 -------- 抽象类
虚基类 -------- 接口
个人觉得这里java中的接口应该对应c++中的抽象类,且该抽象类中每个函数均为纯虚函数。
java与C++的虚函数比较java与C++的虚函数比较
class base { private void print() { System.out.println("base"); } public void doprint() { print(); } } class derive extends base { private void print() { System.out.println("derive"); } } class testVirtual { public static void main(String args[]) { base b = new derive(); b.doprint(); } }
运行结果:base
----------------------------------------------------------------------------
c++例子
class base { private: virtual void print() { printf("base\n"); } public: void doprint() { print(); } virtual ~base(){} }; class derived : public base { virtual void print() { printf("derived\n"); } }; int main(int argc, char* argv[]) { derived d; base& b = d; b.doprint(); return 0; }
运行结果:
derived
----------------------------------------------------------------
如果将上面J***A中的private改为public, 则运行结果为derived
c++
虚函数
1.定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数 [1]
2.语法:virtual 函数返回类型 函数名(参数表) { 函数体 }
3.用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数,也就是允许子类override父类同名方法。
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(也就是完全相同的方法,不能只是函数名相同。)。以实现统一的接口,不同的定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。虚函数是C++多态的一种表现。动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:
1.指向基类的指针变量名->虚函数名(实参表)
2.基类对象的引用名. 虚函数名(实参表)
使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual 函数名=0 ,例如:virtual void fun() = 0,我们把这样的函数(方法)称为纯虚函数。如果一个类包含了纯虚函数,称此类为抽象类。
总结:如果一个子类想要重写父类的方法,那么父类的这个成员方法必须是virtual的,也就是这个方法必须是虚函数。
java
在java中,所有方法默认就是虚拟的,只要方法不是声明为final类型的,那么肯定就是虚函数,不用为方法显示声明为virtual。在<core java2 :volum I>中提到:"In Java, you do not need to declare a method as virtual. Dynamic binding is the default behavior. If you do not want a method to be virtual, you tag
it as final"。所以我们发现,在java中,子类可以重写(override)父类的方法,而父类没有声明virtual。
通过上面的例子, 应该可以看出C++与J***A的虚函数异同点.
网上还有人把这二者的总结用下面的对比描述了一下:
C++ Java
虚函数 -------- 普通函数
纯虚函数 -------- 抽象函数
抽象类 -------- 抽象类
虚基类 -------- 接口
个人觉得这里java中的接口应该对应c++中的抽象类,且该抽象类中每个函数均为纯虚函数。
相关文章推荐
- java与c++在虚函数方面的异同
- java与c++在虚函数方面的异同
- Java和C++的虚函数的异同
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- java中如何使用JNI调用C++写的函数
- Java中的抽象函数与C++中的虚函数
- java调用dll.C++调用没有lib的dll中类中的函数.
- 关注C++/Java/C#技术, 致力于安防监控/移动应用/WEB方面开发 的地址
- C、C++、VC++、Java、C#之间有何异同
- java与C++的虚函数比较
- C++和Java中成员数据名和成员函数名的冲突问题
- Java函数传递对象与C++传递引用
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- 从C++程序员转到Java需注意的十二个方面
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- Java中的抽象函数与C++中的虚函数
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- C++、delphi 、.net中函数指针的异同
- C++与JAVA函数参数传递的比较
- C++和java中多态机制的异同