Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:40:30
visual c++中类的多态性与虚函数

visual c++中类的多态性与虚函数

visual c++中类的多态性与虚函数

多态性是面向对象程序设计方法的一个重要特征,它主要表现在函数调用时实现“一种接口、多种方法”。C++有两种多态性:编译时多态性和运行时多态性,前面所介绍的“允许函数同名”属于编译时多态性,本节主要介绍运行时多态性。

运行时多态性是指当函数名、参数、返回值都相同时,程序在编译时是无法确定要调用的函数的,只能在程序运行时才能够确定下来。这种多态性是通过虚函数来实现的。

从前面学的内容可以知道,声明一个派生类对象,同时也自动声明了一个基类对象。派生类的对象可以认为是基类的对象,但基类的对象不是其派生类的对象。因此,C++允许一个基类对象的指针指向其派生类对象,但不允许一个派生类对象指向其基类对象。

请看下面的例子:



#include "iostream.h"
class BaseClass
{
public:
void Display();
};class DeriveClass : public BaseClass
{public:
void Display();
};
void BaseClass::Display()
{
cout<<"调用了基类的Dispaly成员函数。n";
};
void DeriveClass::Display() //重载
{
cout<<"调用了派生类的Dispaly成员函数。n";
}
void main()
{
BaseClass Base,*pBase;
DeriveClass Derive;
Base.Display();
Derive.Display();
cout<<"----------------------------------------n";
pBase=&Derive;
pBase->Display();
}

运行结果如图1所示。



图1 程序运行结果

从例子中可以清晰地看出,虽然将基类的指针指向了派生类,编译器调用的还是基类的成员函数Display()。而且,虽然在派生类中重载了基类中的同名函数,但只有通过对象调用时才能使用重载,如果使用基类指针指向派生类对象,然后通过指针调用成员函数,则无法调用指定的重载函数。

在一个类继承结构中,可以用一个函数(函数名、函数参数、返回值完全相同)表示不同的功能。例如:在一个图形类继承结构中,设CShape是所有的具体图形(如圆型、三角型)的基类,则函数调用语句pShape->Display()可以绘制一个圆型,也可以绘制三角形:矩形等。具体什么形状,取决于pShape所指的对象。这种运行时多态性是通过虚函数来实现的。

对上面的实例进行简单的修改,利用虚函数完成指定功能。



class BaseClass
{
public:
void virtual Display(); //改写成虚函数
};

…… //不用改变

运行结果如图2所示。



图2 运行结果

虚函数使得设计和实现易于扩充的系统变成可能。微软基类(MFC)使用大量的虚函数来实现类的行为的多态性,如常用的OnDraw()就是一个虚函数




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759