zoukankan      html  css  js  c++  java
  • C++之虚函数与多态

    C++之虚函数与多态:

    多态性(Polymorphism)是指一个名字,多种语义;或界面相同,多种实现,重载函数是多态性的一种简单形式。
    虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编。

    实现运行时多态的关键首先是要说明虚函数,另外,必须用基类指针调用派生类的不同实现版本,冠以关键字 virtual 的成员函数称为虚函数。

    基类指针虽然获取派生类对象地址,却只能访问派生类从基类继承的成员

    使用
    一个虚函数,在派生类层界面相同的重载函数都保持虚特性
    虚函数必须是类的成员函数
    虚函数可以是另一个类的友元
    析构函数可以是虚函数,但构造函数不能是虚函数,虚析构函数用于指引 delete 运算符正确析构动态对象
    一般通过基类指针访问虚函数时才能体现多态性。
    一个虚函数无论被继承多少次,保持其虚函数特性。

    虚函数的重载特性
    在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同
    如果仅仅返回类型不同,C++认为是错误重载
    如果函数原型不同,仅函数名相同,丢失虚特性
    例:

    class  base
    { public : 
          virtual  void  vf1 ( ) ;
          virtual  void  vf2 ( ) ;
          virtual  void  vf3 ( ) ;
          void  f ( ) ;
     } ;
    class  derived : public  base
    { public : 
          void  vf1 ( ) ;		// 虚函数
          void  vf2 ( int ) ;	// 重载,参数不同,虚特性丢失
          char  vf3 ( ) ;		// error,仅返回类型不同
          void f ( ) ;		// 非虚函数重载
     } ;
    void  g ( ) 
    { derived   d ;
       base  * bp = & d ;        // 基类指针指向派生类对象
       bp -> vf1 ( ) ;	        // 调用 deriver :: vf1 ( )
       bp -> vf2 ( ) ;	        // 调用 base :: vf2 ( )
       bp -> f ( ) ;	        // 调用 base :: f ( )
    } ;
    

    成员函数调用虚函数的例子:

    #include <iostream.h>
    class A
    {  public:
      virtual double funA(double x)
      { cout<<"funA of class A called."<<endl;
          return x*x;  }
      double funB(double x)
       {   return funA(x)/2;   }
    };
    class B:public A
    {   public:
        virtual double funA(double x)
      {  cout<<"funA of class B called."<<endl;
          return 2*x*x;  }
    }; 
    class C:public B
    {   public:
      virtual double funA(double x)
     {  cout<<"funA of class C called."<<endl;
          return 3*x*x;
       }
    };
    void main()
    {
         C objc;
         cout<<objc.funB(3)<<endl;
         B objb;
         cout<<objb.funB(3)<<endl;
    }
    

    运行结果:

    funA of class C called.
    13.5
    funA of class B called.
    9
    

    纯虚函数和抽象类
    纯虚函数是一种特殊的虚函数,
    在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做,这就是纯虚函数的作用。
    纯虚函数说明形式:
    virtual 类型 函数名(参数表)= 0 ;
    一个具有纯虚函数的基类称为抽象类,抽象类不能建立对象,不能作为函数返回类型,不能作为传值参数类型,但可以声明抽象类的指针,可以声明抽象类的引用。

  • 相关阅读:
    本地存储 localStorage
    正则对象
    面向对象
    事件
    日期对象
    网易适配与淘宝适配
    自动把网页px单位转换成rem
    湖南省web应用软件(中慧杯)
    百度图片审核功能
    百度ai语音识别
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/12129992.html
Copyright © 2011-2022 走看看