C++ 实用泛型编程之 虚拟函数(C++ virtual function)杂谈

来源:互联网 发布:淘宝优站网址 编辑:程序博客网 时间:2024/05/16 09:46

一 C++虚拟函数(C++ virtual function)杂谈

 

我们在编程的时候,经常会遇到这样的情况,假设有两个对象,你要在函数中分别调用它们的OnDraw方法,我们以前的做法一般是这样的。

void f(int iType)

{

 switch(iType)

 {

 case 1:

  //CCircle OnDraw

  break;

 case 2:

  //CRectangle OnDraw

  break;

 

 }

}

这种方法当然能解决我们的问题,但是如果有新的类型要增加,它就必须要往下加代码才行了,这样函数里的代码会越写越长。你可能会想我的类型不多,往下加也不会太长,但是这种想法是不可取的,因为实际工作当中,我们经常遇到的情况是,一个系统可能要维护好几年,甚至10几年都会有,所以不可预知的事情很多,做设计的时候不能有这种侥幸心里。C++中提供了虚函数,可以方便我们解决这个问题。

class CShape

{

public:

 

 virtual void OnDraw(){}

 

};

class CCircle:public CShape

{

public:

 void OnDraw()

 {

  cout<<"CCircle OnDraw"<<endl;

 }

 

};

class CRectanglepublic CShape

{

 void OnDraw()

 {

  cout<<"CRectangle OnDraw"<<endl;

 }

};

定义一个接口函数,把基类作为型参,对象传入后就可以调用到对应的函数了。

void SelfDraw(CShape *_shap)

{

 _shap->OnDraw();

}

在调用的时候只需要写类似如下的代码。

CCircle c1;

CRectangle r1;

SelfDraw(&c1);

SelfDraw(&r1);

 

程序编译运行后的结果如下。

 


   

可能刚学c++不久的朋友不知道为什么可以这样使用,为什么基类可以正确的调用到子类的函数,那么让我们来看看秘密到底在哪里吧。

 


秘密就是__vfptr(virtual function pointer)__vfptr是一个指针数组指向虚函数,当CCircle对象传入基类指针后,虚函数指针会指向CCircle重载的OnDraw函数,所以我们就会看到SelfDraw中_shap->OnDraw()可以正确调用到它对应子类函数了。

 

 


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不锈钢洗菜盆被草酸腐蚀了怎么办 汽油发电机加了柴油怎么办 装载机发动机加入齿轮油怎么办 印尼的FromE错了怎么办 寄快递被弄坏了怎么办 福田口岸手表被扣怎么办? 网页显示与服务器连接失败怎么办 唯品会中发货无法清关怎么办 国际快递被海关扣了怎么办 我想开一家物流公司手续怎么办? 物流公司把我的货弄丢了怎么办 物流公司压司机工资怎么办 立元增压泵不出水怎么办 高浊度pac不沉怎么办 集水池中沉积大量污泥怎么办 电脑qq截图不好使怎么办 捡了个手机需要指纹怎么办 手机锁屏锁住了怎么办 三星屏锁忘记了怎么办 文字下面有蓝色直线怎么办 苹果x不能截屏了怎么办 u盘在电脑上打不开怎么办 电脑桌面上文档剪切了怎么办 苹果官网查不到保修日期怎么办 吃了发霉的花生怎么办 鸡吃大蒜多了怎么办 玖瑰花叶子黄怎么办 羊偷吃腥油和花生饼吃多了怎么办 肉牛眼睛有点变黄少吃东西怎么办 黑坑草鱼不开口怎么办 花生和瓜子受潮皮了怎么办? 菜叶上长了腻虫怎么办 磨辊耐磨层脱落怎么办 磨辊耐磨层小块脱落怎么办 密封胶皮圈松了怎么办 汽筒里胶皮垫密封不严怎么办 磁耦气缸脱磁了怎么办 无杆气缸行程大怎么办 c4d中模型变成线怎么办 内径槽异性需要车一刀怎么办 轴承太紧影响转速怎么办