简介:
java和C++都是面向对象编程语言,遵循面向对象的特性,继承,封装,多态。
由于java的抽象类和C++虚基类很像,本篇对二者在这两个概念上进行一些比较。
从名称上来讲,标准的概念:
C++:虚函数,虚基类;
java:抽象方法,抽象类,接口。
Java抽象类和C++虚基类的异同:
1. C++虚函数:
C++中,虚函数的存在是为了实现多态。
C++中用virtual关键字来标识虚函数,即普通成员函数加上virtual就成为虚函数。
Java中没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。java中,如果某个方法不想被子类实现,就用final关键字使其变成非虚函数。
2. Java抽象函数/C++纯虚函数
java抽象函数/C++纯虚函数,其实就是没有方法体的方法,即一个方法只有声明,没有定义(实现)。
抽象函数或者说是纯虚函数的存在是为了定义接口。
C++中纯虚函数形式为:virtual void print() = 0;
Java中纯虚函数形式为:abstract void print();
3. Java抽象类
抽象类的存在是因为父类中既包括子类共性函数的具体定义,也包括需要子类各自实现的函数接口。抽象类中可以有数据成员和非抽象方法。
抽象类中可以没有抽象方法,但具有抽象方法的类必须定义为抽象类,抽象类不能实例化。
C++中抽象类只需要包括纯虚函数,就是一个抽象类。如果仅仅包括虚函数,不能定义为抽象类,因为类中其实没有抽象的概念。
Java抽象类是用abstract修饰声明的类,而C++中,需要用virtual void print() = 0;的形式来标识。
4. Java接口
java中的接口,用interface来定义。接口中的变量自动具有public static final属性,接口中的方法自动具有public abstract属性,接口允许多继承。接口中不能有普通成员变量,也不能具有非纯虚函数。
C++中没有接口这个概念,如果所有的方法都是纯虚函数,即全虚基类,可以将其视为和java中的接口是同等概念。这些纯虚函数必须要由子类重写,就像java中的接口中的方法必须被实现一样。
虚基类同样不能实例化。纯虚函数不能有自己的函数体,但是纯虚析构函数除外。
代码对比:
java代码:
Car.java
public abstract class Car {
private String name;
public abstract void run();
}
BydF3Car.java:
public class BydF3Car extends Car{
@Override
public void run() { //必须被实现,否则,编译不过
System.out.println("run by F3!");
}
}
C++代码 :
/*抽象类举例*/
#include <stdio.h>
class Car
{
public:
virtual void run() = 0;
virtual ~Car() {printf(" car destory!\n");}; // 虚析构函数
};
class BydF3Car: public Car
{
public:
virtual void run() // 必须要被实现,即使函数体是空的
{
printf(" run by F3! \n");
}
virtual ~BydF3Car() {printf(" F3 destory! \n");}; // 虚析构函数
};
class BydF0Car: public Car
{
public:
virtual void run() // 必须要被实现,即使函数体是空的
{
printf(" run by F0! \n");
}
virtual ~BydF0Car() {printf(" F0 destory! \n");}; // 虚析构函数
};
void test_func()
{
//Car car; // error: 抽象类不能建立对象
BydF3Car f3;
BydF0Car f0;
f3.run();
f0.run();
printf("\n");
}
int main()
{
test_func();
}
编译:用g++命令:
g++ car.cpp
运行结果:
% ./a.out
run by F3!
run by F0!
F0 destory!
car destory!
F3 destory!
car destory!