• c++学习-虚函数


    #include <iostream>
    using namespace std;
    
    class common{
    public:
        virtual void hello(){cout<<"common hello"<<endl;}
    
    };
    
    class a: public common{
    public:
        //重写基类的虚函数后,本函数也是虚函数 可以省略 virtual
        virtual void hello(){cout<<"a hello"<<endl;}
    };
    
    
    class b: public common{
    public:
        void hello(){cout<<"b hello"<<endl;}
    };
    
    
    
    int main()
    {
        //动态联编 在运行时才确定哪个指针确定哪个对象
        //静态联编 在编译时就确定哪个指针确定哪个对象 速度快,浪费小
    
        //虚函数实现了调用指向真实对象的方法
        common *p = new a();
        p->hello();
    
    
        return 0;
    }

    静态联编:在编译时就确定指针指向的类

    #include <iostream>
    using namespace std;
    
    class common{
    public:
         void hello(){cout<<"common hello"<<endl;}
    
    };
    
    class a: public common{
    public:
         void hello(){cout<<"a hello"<<endl;}
    };
    
    
    class b: public common{
    public:
        void hello(){cout<<"b hello"<<endl;}
    };
    
    
    
    int main()
    {
        a i;
        common *p; //在编译时就确定指向 common 类,再改变也是无效的
        p = &i;
        p->hello();
    
    
        return 0;
    }

    多态满足的条件:

    #include <iostream>
    using namespace std;
    
    class father{
    public:
        virtual void hello(){cout<<"father hello"<<endl;}
    
    };
    
    class son: public father{
    public:
         void hello(){cout<<"son hello"<<endl;}
    };
    
    
    class doc: public father{
    public:
        void hello(){cout<<"doc hello"<<endl;}
    };
    
    void one(father one)
    {
        one.hello();
    }
    void two(father *two)
    {
        two->hello();
    }
    void three(father &three)
    {
        three.hello();
    }
    
    
    int main()
    {
        /**
        满足多态的条件:
        1、继承
        2、父类引用指向子类对象(指针或引用)
        3、基类函数为虚函数
        */
    
        father *p=0;
        int choice;
    
        while(1){
            bool quit = false;
            
            cout<<"0:退出,1:儿子, 2:女儿, 3:父亲"<<endl;
            cin>>choice;
            
            switch(choice)
            {
                case 0:
                    quit=true;
                     break;
                case 1:
                    p = new son();
                    one(*p);
                    break;
                case 2:
                    p = new doc();
                    two(p);
                    break;
                case 3:
                    p=new father();
                    three(*p);
            }
    
    
            if(quit)
            {
                break;
            }
        
        }
    
    
        return 0;
    }

    强制使用静态连接:

    #include <iostream>
    using namespace std;
    
    class father{
    public:
        virtual void hello(){cout<<"father hello"<<endl;}
    
    };
    
    class son: public father{
    public:
         void hello(){cout<<"son hello"<<endl;}
    };
    
    
    class doc: public father{
    public:
        void hello(){cout<<"doc hello"<<endl;}
    };
    
    void one(father one)
    {
        one.hello();
    }
    void two(father *two)
    {
        two->hello();
    }
    void three(father &three)
    {
        three.hello();
    }
    
    
    int main()
    {
    
        father *p=0;
        son a=son();
        p=&a;
        p->father::hello();//强制使用静态连接
    
        return 0;
    }

    基类析构函数应声明为 virutal

    #include <iostream>
    using namespace std;
    
    class father{
    public:
        virtual void hello(){cout<<"father hello"<<endl;}
        father(){cout<<"father construct"<<endl;}
        //@warn
        virtual ~father(){cout<<"father destruct"<<endl;} //父类虚析构函数会自动调用子类虚析构函数
    };
    
    class son: public father{
    public:
         void hello(){cout<<"son hello"<<endl;}
             son(){cout<<"son construct"<<endl;}
        ~son(){cout<<"son destruct"<<endl;}
    };
    
    
    int main()
    {
        father *p = new son();
        delete p;
    
        return 0;
    }
  • 相关阅读:
    设计模式(6)--Adapter(适配器模式)--结构型
    设计模式原则(1)--Single Responsibility Principle(SRP)--单一职责原则
    设计模式(5)--Builder(建造模式)--创建型
    设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
    设计模式(3)--SimpleFactory( [1] 简单工厂模式)--创建型
    JS 的map和array集合组合返回JSON字符串
    HTML中直接写js 函数
    设计模式(3)--FactoryMethod( [2] 工厂方法模式)--创建型
    图片剪贴工具类
    远程Get,Post请求工具类
  • 原文地址:https://www.cnblogs.com/siqi/p/4591981.html
Copyright © 2020-2023  润新知