C++中的虚函数一点理解
2018-03-22 本文已影响0人
梦在原点
今天在看C++的时候,了解到了一个新的概念:虚函数,这使我联想的Java里的一些东西,废话少说,直接上代码
#include<iostream>
using namespace std;
class Animal
{
public:
void Eat()
{
std::cout<<"Animal eat!"<<endl;
}
virtual void Move() //声明了虚函数
{
std::cout<<"Animal move!"<<endl;
}
};
class Tiger : public Animal
{
public:
void Eat()
{
std::cout<<"Tiger eat!"<<endl;
}
void Move()
{
std::cout<<"Tiger Move!"<<endl;
}
};
int main()
{
Tiger* tiger = new Tiger;
Animal* animal = tiger;
animal->Eat();
animal->Move();
}
可以看出,在主函数中实例化了一个Tiger类,然后又实例化了一个Animal类,但在栈内存里生成的animal指向了tiger在堆内存的空间,看一下运行的结果

在Animal的Move函数里有virtual标识,所以在运行的时候才区判断到底是谁的Move方法.而这时的animal是指向(tiger所指的堆内存)的指针,所以这里就调用了Tiger的Move函数.
再看一下在Java里的实现
class Animal{
public void Eat(){
System.out.println("Animal Eat!");
}
public void Move(){
System.out.println("Animal Move!");
}
}
class Tiger extends Animal{
public void Eat(){
System.out.println("Tiger Eat!");
}
public void Move(){
System.out.println("Tiger Move!");
}
}
public class Demo {
public static void main(String args[]){
Tiger tiger = new Tiger();
Animal animal = tiger;
animal.Eat();
animal.Move();
}
}
结果如下:

我的理解是:Java应该是默认Animal类的所有方法都是virtual表示,当然这有些不恰当.
不过从这点可以看出,Java真的是阉割掉了C++里的很多东西.
O(∩_∩)O