Java和C++的虚函数的异同

Posted tan90丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java和C++的虚函数的异同相关的知识,希望对你有一定的参考价值。

 

 

  参考博客:点我

  

  要点: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[20];
    int age;

    Animal(){
        age = 0;
        name[0] = 0;
    }

    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", 10);
    Animal* B = new Dog("B", 20);

    A->information();
    //C++必须显示声明为虚函数才能实现多态 否则只是调用父类的方法而不会调用子类的
    B->information(); 


    return 0;
}
View Code

 

 

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
View Code

 

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);
    }

    
}
View Code

 

包含主函数的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();
        
    }

}
View Code

 

以上是关于Java和C++的虚函数的异同的主要内容,如果未能解决你的问题,请参考以下文章

C++ 与 Java 之中的虚函数抽象函数抽象类接口 比较

C++ 中具有公共继承的虚函数和私有成员

关于C++的虚函数在父类的内部调用

C++中的虚函数(类的向上转换,和向下转换)

一个例子搞懂C++的虚函数和纯虚函数

Java的接口和C++的虚类的相同和不同处?