• C++中的虚函数


    虚函数实现多态:

    多态:相同的调用语句,具有不同的表现形式(不同的执行结果)。多态由继承而来,由虚函数virtual来实现。

    多态(Polymorphism): 我们以相同的指令却唤起了不同的函数,这种性质称为Polymorphism,意思是"theability to assume many forms"(多态)。 
    编译器无法在编译时期判断pEmp->computePay 到底是调用哪一个函数,必须在执行时期才能评估之,这称为后期绑定late binding 或动态绑定dynamic binding。
    至于 C 函数或 C++ 的non-virtual 函数,在编译时期就转换为一个固定地址的调用了,这称为前期绑定early binding 或静态绑定static binding。

    class Father
    {
    public:
        virtual void func(){cout << "调用father的func" << endl;}
    };
    class Son : public Father
    {
    public:
        void func(){cout << "调用Son的func" << endl;}
    };
     
    int main()
    {
        Son son;
        Father *ptrFuther = &son;
        ptrFuther->func(); //若Father类中的func函数有virtual修饰,结果为:"调用Son的func"
        return 0;         //若Father类中的func函数没有virtual修饰,结果为:"调用father的func"
    }

    虚函数的调用:

    /*---------------------------------
    三种调用虚函数的方式比较:
        当函数的形参为对象、指针、引用,调用virtual函数时,
        则指针和引用会有多态,对象无多态。
    ---------------------------------*/
    class father
    {
    public:
    	virtual void run()const
    	{cout<<"父亲可以跑一万米"<<endl;}
    };
    class son :public father
    {
    public:
    	void run()const
    	{cout<<"儿子可以跑十万米"<<endl;}
    };
    
    void A(father);  //形参为father类的对象
    void B(father*); //形参为father类的指针
    void C(father&); //形参为father类的引用
    int main()
    {
    	father *p=0;
    	p = new son;
        A(*p);   //将不会呈现出多态性,因为函数A()是对象调用
        B(p);
        C(*p);
    
    	return 0;
    }
    void A(father A)  //形参为father类的对象
    {                     //由于是用对象的方式来调用虚函数,那就不会有多态作用
    	A.run();          //那么派生类赋给基类对象,将不会调用派生类的同名函数
    }
    void B(father* B) //形参为father类的指针
    {
    	B->run();
    }
    void C(father& C) //形参为father类的引用
    {
    	C.run();
    }
    /*
    结果:
    父亲可以跑一万米
    儿子可以跑十万米
    儿子可以跑十万米
    */
    son s;
    father *p = &s; //指针形式 - 多态
    p->run(); //"儿子可以跑十万米"
    father &p1 = s; //引用形式 - 多态
    p1.run(); //"儿子可以跑十万米"
    father p2 = s; //对象形式 - 无多态
    p2.run(); //"父亲可以跑一万米"
    

      

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    c# 代码控制文件夹权限时,只显示特殊权限的问题
    C#使用SQLite数据库遇到的问题(二)
    GC工作原理
    Thread
    -static
    String 练习题
    更进ATM
    继承 示例
    数组
    求奇偶数
  • 原文地址:https://www.cnblogs.com/htj10/p/10200728.html
Copyright © 2020-2023  润新知