zoukankan      html  css  js  c++  java
  • 虚函数

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

    #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。
  • 相关阅读:
    Struts2.1.8 + Spring3.0+ Hibernate3.2整合笔记
    SSH整合之_架构的历史序列图
    Spring整合Hibernate笔记
    Oracle日志文件的管理与查看
    java调用Oracle存储存储过程
    Oracle PLSQL笔记(过程的创建和及调用)
    使用 Spring 2.5 TestContext 测试DAO层
    SpringBoot 启动慢的解决办法
    C++ CEF 浏览器中显示 Tooltip(标签中的 title 属性)
    Chromium CEF 2623 -- 支持 xp 的最后一个版本源码下载和编译步骤
  • 原文地址:https://www.cnblogs.com/guoyujiang/p/12015997.html
Copyright © 2011-2022 走看看