参考博客:点我

  

  要点:Java中的普通函数默认为虚函数,因此动态绑定的行为是默认的,而C++必须将方法声明为虚函数(virtual关键字),执行时才会进行动态绑定,详细区别可参考代码以及注释。

  代码大致:实现父类 Animal类,包含数据成员 姓名和年龄,以及实现eat方法和informa方法,子类Dog类继承于Animal,并实现方法的覆盖。Java和C++中都没有显示声明为虚函数,但观察输出结果可知,Java中实现了动态绑定,而C++没有,只有将相应函数加上virtual关键字,才实现动态绑定。这就是Java和C++处理的不同之处

C++代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; class Animal{
public:
char name[];
int age; Animal(){
age = ;
name[] = ;
} Animal(char* nName, char nAge){
strcpy(name, nName);
age = nAge;
} void eat(){
printf("Animal can eat!\n");
} //可在此加上virtual关键字观察输出区别
void information(){
printf("%s is a Animal, it's %d years old!\n", name, age);
}
}; class Dog :public Animal{ public:
Dog() :Animal(){}
Dog(char* nName, int nAge) :Animal(nName, nAge){} void eat(){
printf("Dog can eat!\n");
} void information(){
printf("%s is a Dog, it's %d years old!\n", name, age);
}
}; int main()
{
Animal* A = new Animal("A", );
Animal* B = new Dog("B", ); A->information();
//C++必须显示声明为虚函数才能实现多态 否则只是调用父类的方法而不会调用子类的
B->information(); return ;
}

Java代码:

Animal类:

package com.hao;

public class Animal {
String name = "";
int age = 0; Animal(){} /**
* @param name 动物的姓名
* @param age 动物的年龄
*/
public Animal(String name, int age) {
super(); //其super类其实为Object类
this.name = name;
this.age = age;
} public void eat(){
System.out.println("Animal can eat!");
} public void information(){
System.out.printf("%s is a Animal, it's %d years old!\n", name, age);
} }//Animal

Dog类:

package com.hao;

public class Dog extends Animal {

    /**
* 默认构造函数
*/
public Dog() {
super();
// TODO 自动生成的构造函数存根
} /**
* @function 带参构造函数
* @param name 狗的姓名
* @param age 狗的年龄
*/
public Dog(String name, int age) {
super(name, age);
// TODO 自动生成的构造函数存根
} /* (非 Javadoc)
* @see com.hao.Animal#eat()
*/
@Override
public void eat() {
// TODO 自动生成的方法存根
//super.eat();
System.out.println("Dog can eat!");
} /* (非 Javadoc)
* @see com.hao.Animal#information()
*/
@Override
public void information() {
// TODO 自动生成的方法存根
//super.information();
System.out.printf("%s is a Dog, it's %d years old!\n", name, age);
} }

包含主函数的Main类:

package com.hao;

public class Main {

    public static void main(String[] args) {
// TODO 自动生成的方法存根
Animal A = new Animal("A", 10);
Animal B = new Dog("B", 20); A.information();
B.information(); //Java中默认使用动态绑定---区别于C++ A.eat();
B.eat(); } }

Java和C++的虚函数的异同的更多相关文章

  1. JAVA – 虚函数、抽象函数、抽象类、接口

     本文转载地址:http://blog.csdn.net/trojanpizza/article/details/6556604 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加 ...

  2. 【转】JAVA – 虚函数、抽象函数、抽象类、接口

    1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行 ...

  3. Java C++ 比较 – 虚函数、抽象函数、抽象类、接口

    [转自]原文 Java – 虚函数.抽象函数.抽象类.接口 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它 ...

  4. C++虚函数【Java有虚函数吗?】

    1,简单介绍 定义在基类中的函数,子类必须对其进行覆写![必须对其进行覆写?!]——Java中的接口.Abstract方法中的抽象类也有这样的要求. C++中定义: virtual void deal ...

  5. C++中的纯虚函数和虚函数的作用

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

  6. 为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?

      首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected vo ...

  7. 私有虚函数的特点(C++和Java的机制还有所不同)

    多态性与将实现多态的函数的访问限定符没有任何关系,private 函数仍然可以实现多态,它的指针仍然位于vtbl中,只不过该函数的多态一般只能在基类的内部由其他非虚函数调用该函数的时候反映出来,访问限 ...

  8. 关于C++与Java中虚函数问题的读书笔记

    之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...

  9. C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

    由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...

随机推荐

  1. 转载《遭受arp攻击怎么办》

    ARP(Address Resolution Protocol,地址解析协议)协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的进行.ARP攻击仅能在以太网(局 域网如: ...

  2. c/c++程序员必须要掌握开源项目

    作为一个经验丰富的C/C++程序员, 肯定亲手写过各种功能的代码, 比如封装过数据库访问的类, 封装过网络通信的类,封装过日志操作的类, 封装过文件访问的类, 封装过UI界面库等, 也在实际的项目中应 ...

  3. css中的1px并不总等于设备的1px(高分辨率不等 低分辨等)

    在css中我们一般使用px作为单位,在桌面浏览器中css的1个像素往往都是对应着电脑屏幕的1个物理像素,这可能会造成我们的一个错觉,那就是css中的像素就是设备的物理像素.但实际情况却并非如此,css ...

  4. 使用Object类型的多态引用是会付出代价的

    import java.util.*; public class FiveShi { String name; public void eat(){ System.out.println(" ...

  5. 记录Js

    1.对于js,没有系统的学习.有要经常的用到,每次都是百度查找,为了以后能查询. (1). $(function () { $('.restbtn').on("click", fu ...

  6. android使用镜像 Android sdk 和源码等

    HTTP Proxy Server:mirrors.neusoft.edu.cn HTTP Proxy Port :80

  7. poj3693

    //Accepted 12004 KB 407 ms /* source:poj3693 time :20150819 by :songt */ /*题解: 搞了一天,总算弄完了 首先,我们来明确一个 ...

  8. Android深度探索--HAL与驱动开发----第五章读书笔记

    第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...

  9. [解决方案] pythonchallenge level 3

    http://www.pythonchallenge.com/pc/def/equality.html 根据页面提示:一个小写字母刚刚好被左右3个大写字母包围. 查看页面代码得到需要处理的字符. 将字 ...

  10. ACCESS --第一章

    一.ACCESS2007的安装 装完整版的office2007办公软件就集成了相应的ACCESS2007 二.主要组成 ACCESS由表.查询.报表.窗体.页.宏和模块组成 1.表 表是存储数据的对象 ...