虚函数

来源:互联网 发布:淘宝累计销量没有了 编辑:程序博客网 时间:2024/06/05 10:37

                        《虚函数》

虚函数必须是基类的非静态成员函数,其访问权限可以是protectedpublic

在基类的类定义中定义虚函数的一般形式:

  

virtual 函数返回值类型 虚函数名(形参表)  

函数体 }

虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,

在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,

在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。

以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,

则它继承其基类的虚函数。

  

当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,

即在程序运行时动态地选择合适的成员函数。

  

注:下行语义容易使人产生理解上的偏差,实际效果应为:  

如存在:Base -> Derive1 -> Derive2 及它们所拥有的虚函数func()

则在访问派生类Derive1的实例时,使用其基类Base及本身类型Derive1

或被静态转换的后续派生类Derive2的指针或引用,均可访问到Derive1所实现的func()。)  

动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,

其格式:

  

指向基类的指针变量名->虚函数名(实参表)  

或 基类对象的引用名虚函数名(实参表)  

虚函数是C++多态的一种表现 

 

例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,

则必须把父类的该函数(方法)设为virtual(虚函数)。  

使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。 

<<如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,

可以把此函数(方法)设为virtual 函数名=0 我们把这样的函数(方法)称为纯虚函数>>

  

如果一个类包含了纯虚函数,称此类为抽象类 。

虚函数的实例 

 

#include<iostream.h>

class Cshape

{ public: void SetColor( int color) 

{ m_nColor=color;

}

void virtual Display( void) 

{ cout<<"Cshape"<<endl; }

private:int m_nColor;};

class Crectangle: public Cshape

{public:void virtual Display( void) 

{ cout<<"Crectangle"<<endl; }};

class Ctriangle: public Cshape

{void virtual Display( void) 

{ cout<<"Ctriangle"<<endl; }};

class Cellipse :public Cshape

{public: void virtual Display(void) 

{ cout<<"Cellipse"<<endl;}};

void main()

{Cshape obShape;

Cellipse obEllipse;

Ctriangle obTriangle;

Crectangle obRectangle;

Cshape * pShape[4]={ &obShape, &obEllipse,&obTriangle, & obRectangle };

for( int I= 0; I< 4; I++)pShape[I]->Display( );}

 

本程序运行结果:  CshapeCellipseCtriangleCrectangle

 

所以,从以上程序分析,

实现动态联编需要三个条件:  

1、 必须把动态联编的行为定义为类的虚函数。  

2、 类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。  

3、 必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数

如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员,那么首先在基类中

将这个同名函数说明为虚函数。这样通过基类类型的指针,就可以使属于不同派生类的不同

对象产生不同的行为,从而实现运行过程的多态。

virtual 函数类型 函数名(形参表)

运行过程中的多态需要满足3个条件:

1.赋值兼容规则

2.声明虚函数

3.由成员函数来调用或者是通过指针,引用来访问虚函数。

《纯虚函数》

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

声明为纯虚函数之后,基类中就可以不再给出函数的实现部分。

它的函数体由派生类给出。

基类中也允许给出纯虚函数的实现,但也必须由派生类覆盖,否则无法实例化。

《抽象类》

定义:带有纯虚函数的类是抽象类

作用:通过它为一个类族建立一个公共的接口,是他能够更有效的实现多态特性。

抽象类不可以实例化,即不能定义抽象类的对象,但可以定义一个抽象类的指针和引用。

通过指针或引用,就可以指向并访问派生类的对象,进而访问派生类的成员,这种访问具有

多态性。

原创粉丝点击