一.基本概念理解
注意:
(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.虚析构函数
注意:
(1)派生类应该从它的基类公有派生。
(2)必须首先在基类中定义虚函数。
(3)派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。
(4)一般通过基类指针访问虚函数时才能体现多态性。
(5)一个虚函数无论被继承多少次,保持其虚函数特性。
(6)虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数。
(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 ; // 纯虚函数
} ;
在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限。
抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的。 抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类。一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类。
抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了。
心得:
虚函数和多态性能够使成员函数根据调用对象的类型产生不同的动作,这给程序设计赋予很大的灵活性。多态性特别适用于实现分层结构的软件系统,便于对问题抽象时定义共性,实现定义区别。登录界面的多态性,例如,图书管理系统的登录,老师登录的界面和学生登录的界面就是不一样的,