C++对虚函数与多态性的认识

一.基本概念理解

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

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

1.虚函数与基类指针

注意:

1)一个虚函数,在派生类层界面相同的重载函数都保持虚特性
2)虚函数必须是类的成员函数
3)不能将友元说明为虚函数,但虚函数可以是另一个类的友元
4)析构函数可以是虚函数,但构造函数不能是虚函数

class Father
{
public :
int age;
virtual void ShowMsg(){cout<<"This is father.";}        //virtual必须有
};
class Son :public Father
{
public :
virtual void ShowMsg(){cout<<"This is Son.";}        //virtual关键字可有可无
};
class Daughter :public Father
{
public :
void ShowMsg(){cout<<"This is Daughter."<<endl;}
};
void ShowYourName(Father* fa)
{
fa->ShowMsg();
}
int _tmain(int argc, _TCHAR* argv[])
{
Father fa;
Son son;
Daughter da;
Father* pFa;
pFa = &fa;
ShowYourName(pFa); //结果this is father
pFa = &son;
ShowYourName(pFa); //结果this is son
pFa = &da;
ShowYourName(pFa); //结果this is daughter
return 0;
}

2. 虚函数的重载特性

1)在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同

2)如果仅仅返回类型不同,C++认为是错误重载

3)如果函数原型不同,仅函数名相同,丢失虚特性

3.虚析构函数

建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数。 析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象。

注意:

1)派生类应该从它的基类公有派生。

2)必须首先在基类中定义虚函数。

3)派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。

4)一般通过基类指针访问虚函数时才能体现多态性。

5)一个虚函数无论被继承多少次,保持其虚函数特性。

6)虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数。

7)构造函数、内联成员函数、静态成员函数不能是虚函数。

(8析构函数可以是虚函数,通常声明为虚函数,但构造函数不能是虚函数


 4. 纯虚函数和抽象类理解

(1)纯虚函数

在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。

纯虚函数是一个在基类中说明的虚函数,在基类中没有定义, 要求任何派生类都定义自己的版本

纯虚函数为各派生类提供一个公共界面

纯虚函数说明形式:

         virtual 类型  函数名(参数表)= 0 ;

 一个具有纯虚函数的基类称为抽象类。

例如:

class point { /*……*/ } ;
class shape ;          // 抽象类
{ point center ;
     ……
 public :
 point  where ( ) { return  center ; }
 void  move ( point p ) {center = p; draw ( ) ; }
  virtual  void rotate ( int ) = 0 ;               //纯虚函数
  virtual  void draw ( ) = 0 ;               // 纯虚函数
} ;
在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。

  抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。 抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。

注意:
(1)抽象类不能建立对象
(2)抽象类不能作为函数返回类型
(3)抽象类不能作为传值参数类型

心得

虚函数和多态性能够使成员函数根据调用对象的类型产生不同的动作,这给程序设计赋予很大的灵活性。多态性特别适用于实现分层结构的软件系统,便于对问题抽象时定义共性,实现定义区别。登录界面的多态性,例如,图书管理系统的登录,老师登录的界面和学生登录的界面就是不一样的,



 

 

猜你喜欢

转载自blog.csdn.net/dxy2017/article/details/80880664