• 虚函数


    关键词 :执行期间 动态联编

    #include <iostream>
    
    //////////////////////////////////
    
    //多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,
    //但因个体差异而采用不同的策略
    
    //多态:一切用来指向基类的指针或引用来操作对象
    
    //////////////////////////////////
    using namespace std;
    class A{
    public:
        virtual void print(){
            cout<<"A"<<endl;
        }
    };
    class B:public A
    {
    public:
        void print(){
            cout<<"B"<<endl;
        }
    };
    
    int main()
    {
        A a;
        B b;
    
        A * p1 = &a;
        A * p2 = &b;
    
        p1 -> print();
        p2 -> print();
    
        return 0;
    }

     

     

    基类对象指针:根据类型(基类)找函数

    #include <iostream>
    
    using namespace std;
    
    class A{
    public:
        void print(){
            cout<<"A"<<endl;
        }
    };
    class B:public A
    {
    public:
        void print(){
            cout<<"B"<<endl;
        }
    };
    
    int main()
    {
        A a;
        B b;
    
        A * p1 = &a;
        A * p2 = &b;  
    
        p1 -> print();
        p2 -> print();
    
        return 0;
    }

     

     

    多态性未体现:

    #include <iostream>
    
    using namespace std;
    
    class A{
    public:
        void print(){
            cout<<"A"<<endl;
        }
    };
    class B:public A
    {
    public:
        void print(){
            cout<<"B"<<endl;
        }
    };
    
    int main()
    {
        A a;
        B b;
    
        a.print();
        b.print();
    
        return 0;
    }

     

    基类成员函数用virtual修饰:

    1,基类大小多出4个字节

    指针 _vfptr 指向一个 函数指针数组

    数组中保存所有虚函数的地址

    2,派生类继承基类,会继承基类的函数指针里元素

    3,若果派生类有重写,那么重写后的函数地址会覆盖函数指针数组里的函数地址

    4,调用函数时,会去虚函数表中找函数

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        virtual void show() {
            cout << "A" << endl;
        }
        virtual void show2() {
            cout << "A" << endl;
        }
        void show3() {
            cout << "A" << endl;
        }
    };
    
    class B :public A
    {
    public:
        void show() {
            cout << "B" << endl;
        }
    };
    class C :public A
    {
    public:
        void show() {
            cout << "C" << endl;
        }
    };
    
    int main()
    {
        A a;
        B b;
    
        while (1);
    }

    断点调试监视:

    红色箭头:继承基类函数指针里的元素,重写函数地址

    紫红箭头:继承基类函数指针里的元素,空间不同

    亮青箭头:继承基类函数指针里的元素

    监视方法:

    1,首先断点

    2,本地windos调试

    3,打开监视窗口

      调试->窗口->监视,任选其一

    4,拖拽变量到监视窗口

    动手思考:

    编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车类(motorcar),
    从bicycle类和motorcar类派生出摩托车类(motorcycle),它们都有Run、Stop等成员函数。
    在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,
    调用其Run()、Stop()函数,观察其执行情况。
    再分别用vehicle类型的指针来调用几个对象的成员函数,看看能否成功;
    把Run、Stop定义为虚函数,再试看。程序名:lab8_2.cpp。
  • 相关阅读:
    获取图片的大小(宽高):BytesIO
    python中url解析 or url的base64编码
    [extjs5学习笔记]第三十七节 Extjs6预览版都有神马新东西
    【翻译】Ext JS 6早期访问版本发布
    【翻译】Ext JS 6有什么新东西?
    【Java二十周年】Delphi转行java的一些小感触
    Cursor类取出数据
    通过服务修改widgetUI
    安卓笔记--Style的继承
    [ExtJS5学习笔记]第三十六节 报表组件mzPivotGrid
  • 原文地址:https://www.cnblogs.com/guoyujiang/p/12015997.html
Copyright © 2020-2023  润新知