类的多态(Polymorphism)与虚函数(virtual function)

简单理解多态与虚函数

多态性是指一段程序能够处理多种类型对象的能力,换而言之就是一个接口,多种方式。而虚函数则常用来实现多态性。

由同一个基类派生出的多个派生类在继承着基类的一些特性的同时也表现出一些方面的不同,而对于一些派生类的共有属性,也许他们的实现方式又各自不同,举一个很简单的例子,假设基类为图形类,由它可以派生出三角形类,矩形类,他们都有面积这个属性,然而由于是不同的图形,在计算面积时,所用的方式也各自不同,那么遇到这种情况该怎么办呢?

我们可以在基类里声明一个虚函数,当这个类被派生后,类中就可以实现运行过程中的多态。

通俗的讲就是在基类中用virtual关键字来限定那个需要多种实现方式的成员函数,在派生类中,函数名,参数不变,但实现该函数时方式不同。

有人可能会问,既然改写了该函数,我完全可以通过派生类的定义出的对象来调用该函数,虚函数的意义到底在哪呢?

答案很简单,利用对象直接调用这个函数自然违背了我们想实现多态的初衷,我们的目的是:利用很多基类指针指向不同的派生类的对象,通过指向不同对象的基类指针调用基类的虚函数,让系统根据指针所指向的不同的派生类,自动选择实现该方式的方法!

接上个例子,假设我们要让系统依次计算不同的5个图形的面积,我们可以声明一个基类型的指针数组,然后让数组里的每个指针指向不同的图形,用基类指针调用基类中计算面积的函数,如果其中一个指针指向的是三角形对象,它就会选择计算三角形面积的方式(底*高/2),如果指向的是矩形对象,他就会选择计算矩形面积的方式(底*高)......

多态的实现

下面谈谈如何实现多态:

先记住下面几点:

①虚函数必须是非静态的成员函数,它的声明只能在类定义中的函数原型声明中,而不能在成员函数实现的时候。

②赋值兼容规则:派生类指针可以指向派生类对象。

③通过基类的指针、引用来访问虚函数。

实例部分:

下面定义一个A类作为基类,B类和C类作为A类的派生类,基类里定义了一个虚函数 Introduce()

#include <iostream>
using namespace std;

class A
{
public:
	virtual void Introduce();          //声明虚函数Introduce
};
void A::Introduce()                    //实现部分,不加virtual
{
	cout << "I'm class A." << endl;
}

class B : public A
{
public:
	void Introduce();                  //派生类中声明基类虚函数,可以不加virtual
};
void B::Introduce()
{
	cout << "I'm class B." << endl;
}

class C : public A
{
public:
	void Introduce();
};
void C::Introduce()
{
	cout << "I'm class C." << endl;
}

int main()
{
	A a; B b; C c;                     //定义三个类各自的对象a,b,c
	A *p[3];                           //定义基类指针数组
	p[0] = &a;                         //分别指向不同的对象
	p[1] = &b;
	p[2] = &c;
	for (int i = 0; i < 3; i++)
		p[i]->Introduce();
	return 0;
}

运行结果:



部分内容参考自《C++ 程序设计基础教程》



猜你喜欢

转载自blog.csdn.net/gsdxiaohei/article/details/79957775
今日推荐