虚函数、纯虚函数和多态

虚函数

就是懒汉们想要用基类指针指向派生类对象,又想调用派生类函数,就创造出这个东西,虚函数。

直接列子:

<pre name="code" class="cpp">class CShape{
public:
	void display(){cout<<"Shape  \n";}
};
class CCircle:public CShape{
public:
	void display(){cout<<"Circle \n";}

};
class CRect:public CShape{
public:
	void display(){cout<<"Rect \n";}
};


 

 基类CShape,派生类CCircle CRect      

若做如下定义

<pre name="code" class="cpp">        CShape aShape;
	CCircle aCircle;
	CRect aRect;
	CShape* p[3]={&aShape,&aCircle,&aRect};
	for (int i =0; i<3;i++)
	{
		p[i]->display();
	}

 p是一个基类的指针,当p指向派生类的对象时,如*p=&aRect, 指针p所获得的信息只有基类所定义的一切,派生类的是无法通过该基类指针实现的。 

所以上面代码中的p[i],输出结果就是

Shape
Shape
Shape
但如果你在display函数前加个 virtual 就不一样了

<pre name="code" class="cpp">class CShape{
public:
	virtual void display(){cout<<"Shape  \n";}
};
class CCircle:public CShape{
public:
	virtual void display(){cout<<"Circle \n";}

};
class CRect:public CShape{
public:
	virtual void display(){cout<<"Rect \n";}
};


 

 
 这样再执行p[i],显示的就是 

Shape

Circle

Rect

我们用p[i]->display,这样一般化的语句就能执行调用功能不同的函数,程序的这种能力就是“the ability to assume tmany forms”, 起个高大上的名字,就叫 多态。

那么问题来了,

我完全可以通过调用

CCircle::display();来调用我派生类的函数啊,为什么非要用定义个基类指针来 操作呢,还要定义虚函数,多麻烦!!

对咯,对于这个程序那是很麻烦, 但你要是写个大工程,你还要用CCircle::display()这种形式,就很麻烦了。


继续看上面的例子, 对于基类的display(),我们可能仅仅是为了定义虚函数准备的,因为基类函数我们一般是不具体实现什么的,

就像Shape,本身就是个抽象的代表形状,他是所有形状的一个抽象概念,display Shape并没有实际意义,但又不能去掉,因为后面的派生类要通过她定义虚函数,

所以又一个概念出来了,纯虚函数。

这样定义:

	virtual void display() = 0;
将基类中的display() “ = 0 ”,就ok了,这就是 纯虚函数。说白了,纯虚函数 就是不用写该函数的函数功能,专门为它的派生类 准备出来 重定义用的。


想来 好多东西都是各位“懒汉们”创造出来的,因为”懒“,所以千方百计想要用最简化的东西,写出最理想的代码。这个就是。



特别说明: 以上内容参考 《深入浅出MFC》一书 总结出来的。在此跪谢前辈。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值