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 CRectangle: public 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()可以正确调用到它对应子类函数了。
- C++ 实用泛型编程之 虚拟函数(C++ virtual function)杂谈
- 【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)
- C++——中的虚函数(Virtual function)
- [翻译] Effective C++, 3rd Edition, Item 36: 绝不要重定义一个 inherited non-virtual function(通过继承得到的非虚拟函数)
- C编程之core dump杂谈
- 【C++】template vs virtual function
- C++: Pure Virtual Function Called
- C语言之实用函数
- C-函数杂谈
- c / c++ virtual function and pure virtual function summarize
- c语言与函数式编程1(wrapper function)
- 虚函数(virtual function)
- C++ 实用泛型编程之设计通用型程序(模板)杂谈
- [c/c++]析构函数virtual相关
- C/C++与Matlab混合编程实用函数简介
- C++&杂谈
- C++之考虑virtual函数以外的其他选择(35)---《Effective C++》
- C++之绝不重新定义继承而来的non-virtual函数(36)---《Effective C++》
- hihocoder#1039之字符消除
- Android 动态渐变圆环 path的使用
- C++笔记
- android多分辨率多屏幕密度下UI适配方案
- 谈谈对于企业级系统架构的理解
- C++ 实用泛型编程之 虚拟函数(C++ virtual function)杂谈
- android ListView优化之ViewHolder的超简洁写法
- 每日一指令(mount)
- C#读取string类型的xml过滤注释内容
- 可视化的正则表达式
- HDU5124 lines(贪心)
- C++中的static关键字
- 如何高效率从整数中地取个位上的数,十位,百位
- 系统维护 Win7安装过程中创建扩展分区和逻辑分区的方法