C 三则 如无必要 勿增虚函数
创始人
2024-07-30 01:01:24
0

虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。

一、如无必要,勿增虚函数

比如我们有以下关于球的类层次设计 ,其中需要判断某种球是否是可以踢的(kickable):

 

  1. class Ball  
  2. {  
  3. public:  
  4. virtual bool IsKickable() = 0;  
  5. };  
  6. class Football  
  7. {  
  8. public:  
  9. virtual bool IsKickable() {return true;}  
  10. };  
  11. class Basketball  
  12. {  
  13. public:  
  14. virtual bool IsKickable() {return false;}  
  15. }; 

乍一看觉得挺合理的,但仔细想想,其实IsKickable是某种球的本质静态属性,用一个虚函数来表示这种信息,是一种浪费,更加合理的方式应该是用一个数据成员和一个普通成员函数:

  1. class Ball  
  2. {  
  3. public:  
  4. bool IsKickable(){return m_bIsKickable;}  
  5. protected:  
  6. bool m_bIsKickable;  
  7. };  
  8. class Football  
  9. {  
  10. public:  
  11. Football():bIsKickable(true){}  
  12. };  
  13. class Basketball  
  14. {  
  15. public:  
  16. Basketball():bIsKickable(false){}  
  17. }; 

类似这样的设计我碰到过至少两次,一次是被review,一次是review,结果都是改成了第二种我们认为比较合理的方式。

二、不要用 "||" 做复杂的逻辑判断

"||"是"或运算"符号,当你确实将其作为或运算时,的确很简单明了。但是有人发明了一种比较tricky的方法来使用它。

举个例子,我们的程序可能有三种状态:A, B,或者C,现在有一个变量bOk,如果程序当前状态为C的话,bOk必须为true,如何来assert?一般比较直观的做法是:

  1. if(IsC()) assert(bOk); 

 

但是有人觉得有个if判断比较麻烦,于是发明了:

  1. assert(IsA() || IsB() || bOk); 

 

逻辑理解为:如果不是A也不是B,那么bOk必须为true。虽然代码简化成只有单个语句,但是,这对理解却带来了挑战。
我们一般不推荐用这种不直观的方式来做判断。

三、纯虚函数与默认实现

有一个基类,我们期望它是一个抽象类,但同时我们又期望其虚函数都有默认实现。这其实一个语法层面的问题:我们是可以把一个虚函数设为纯虚的同时提供默认实现的。(但一开始以为不行,想去把构造函数设为pretected来达到类似的效果,但这样从概念上来讲就不是很合理了)

对于这种情况,我想也没必要把所有函数设为纯虚,找一个典型,如把析构函数设为纯虚并提供默认实现:

  1. class Base  
  2. {  
  3. public:  
  4. virtual ~Base() = 0;  
  5. };  
  6. Base::~Base() {printf("~Base()\n");}  
  7. class Derive: public Base  
  8. {  
  9. public:  
  10. virtual ~Derive(){printf("~Derive()\n");}  

这样,基类就已经是一个抽象类了,应该是一个可以接受的方案。

【编辑推荐】

  1. 关于C++虚函数那点破事
  2. 浅谈怎样加快C++代码的编译速度
  3. 善于从bug中分析问题也是一种能力
  4. 页面制作也是一门艺术
  5. 如何从网站数据分析挖掘核心服务

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...