美文网首页
2019-07-13 多态

2019-07-13 多态

作者: 知成 | 来源:发表于2019-07-13 10:51 被阅读0次

    多态


    字面意思是多种状态。在多态里涉及两个定义。

    • 覆盖:即子类继承父类的同时重写了父类的函数,从而使父类中的同名函数,以子类重写的为准。前提条件,父类对应的函数为虚函数。
    • 隐藏:即子类继承父类的同时重写了父类的函数,但是父类中的同名函数,依然存在。只是子类默认调用的是重写的函数。但是父类的函数还是存在的,可以以别的方式调用。前提:父类对应的函数非虚函数。

    多态的本质:在一个类中创建虚函数后,会产生一个虚表,虚表中存储者虚函数的地址,当重写虚函数时,虚表的地址会发生改变。

    下面我写了一个简单的demo

    #include<iostream>
    using namespace std;
    class CAnimal
    {
    public:
        virtual void Description();
        void Feature();
    };
    class CBird:public CAnimal
    {
    public:
        void Description();
        void Feature();
    };
    int main()
    {
        CAnimal animal;
        CBird bird;
        CAnimal *panimal = NULL;
        panimal = &animal;
        panimal->Description();
        panimal->Feature();
        cout << "........................................." << endl;
        panimal = &bird;
        panimal->Description();
        panimal->Feature();
        cout << "........................................." << endl;
        animal.Description();
        animal.Feature();
        cout << "........................................." << endl;
        bird.Description();
        bird.Feature();
        cout << "........................................." << endl;
        getchar();
        getchar();
        return 0;
    }
    
    void CAnimal::Description()
    {
        cout << "动物" << endl;
    }
    
    void CAnimal::Feature()
    {
        cout << "我是有生命的" << endl;
    }
    
    void CBird::Description()
    {
        cout << "鸟儿" << endl;
    }
    
    void CBird::Feature()
    {
        cout << "我是有生命的鸟儿,我会飞" << endl;
    }
    

    执行结果如下:
    动物
    我是有生命的
    .........................................
    鸟儿
    我是有生命的
    .........................................
    动物
    我是有生命的
    .........................................
    鸟儿
    我是有生命的鸟儿,我会飞
    .........................................

    用GDB调试查看虚表结果如下图所示:

    1.png 2.png 3.png

    相关文章

      网友评论

          本文标题:2019-07-13 多态

          本文链接:https://www.haomeiwen.com/subject/mqepkctx.html