java与c++中多态的实现区别
这个java简单的例子的输出是animal move,体现了多态的含义。
public class Test {
public static void main(String []args){
Animal animal = new Dog();
animal.move();
}
}
class Animal{
void move(){
System.out.println("animal move");
}
}
class Dog extends Animal{
@Override
void move() {
System.out.println("dog move");
}
}
而c++中,则需要引入virtual这个关键字对函数修饰,成为虚函数,对应引入的还有虚函数表这个概念:
1.运行时需要额外的内存将函数信息进行存储,使用正确指向函数的指针。
2.每次调用虚函数都会遍历虚函数表查询使用了哪个虚函数。
#include <iostream>
#include<string>
using namespace std;
class Animal {
public:
void Move() {
cout << "animal move" << endl;
}
};
class Dog : public Animal {
public:
virtual void Move() override { //override仅仅取表示重写方法作用 //,可以省略,类似java中的@Override
cout << "dog move" << endl;
}
};
int main() {
Animal *a = new Dog();
a->Move();
std::cin.get();//暂停vs控制台作用(getchar())
return 0;
}
此外,如果基类Animal中改为virtual void Move() = 0;不提供具体实现,在c++中这被称为纯虚函数,然后实现交给子类重写,就也是java中接口的概念,当然此时不可以写Animal *a = new Animal(),这和java的接口不能被实例化的想法(除去内部匿名类)一致。