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在堆内存的空间,看一下运行的结果


image.png

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

结果如下:


image.png

我的理解是:Java应该是默认Animal类的所有方法都是virtual表示,当然这有些不恰当.

不过从这点可以看出,Java真的是阉割掉了C++里的很多东西.
O(∩_∩)O

上一篇 下一篇

猜你喜欢

热点阅读