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的接口不能被實例化的想法(除去內部匿名類)一致。