zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    等宽布局和flex
    antd按需加载
    linux-redis cluster集群(redis5.x)
    linux-mysql-主从同步
    mysql-行转列
    Spring Bean 作用域
    ArrayList、LinkedList区别(jdk8)
    java类及实例初始化顺序
    线程池-结构
    GIT基础
  • 原文地址:https://www.cnblogs.com/siqi/p/4591981.html
Copyright © 2011-2022 走看看