`
kmplayer
  • 浏览: 508777 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

条款37:绝对不要重新定义继承而来的非虚拟函数

 
阅读更多
1,先看个例子:
class B {
public:
  void mf();
  ...
};
class D: public B { ... };

D x;
B *pB = &x;                   // get pointer to x
D *pD = &x;                   // get pointer to x

pB->mf(); 
pD->mf();   
//如果D定义自己版本的mf,上述两个函数调用结果就会不同.

造成这一局面的原因:非虚拟函数如B::mf和D::mf是静态绑定.
即:调用哪个,取决于pB和pD的静态类型.

上述做法显然违背:
适用于B对象的每一件事也适用于D对象

如果D真有必要实现与B不同的mf,这种情况下就不要以public方式继承.
如果D还真的必须以public继承,那么mf应该声明为虚函数.

2,一个结论:无论什么情况下,都不应该重新定义一个继承而来的非虚拟函数.
分享到:
评论

相关推荐

    EffectiveC++ and more Effective C++

     ·条款二十四:理解虚拟函数、多继承、虚基类和RTTI所需的代价  ·条款二十五:将构造函数和非成员函数虚拟化  ·条款二十六:限制某个类所能产生的对象数量  ·条款二十七:要求或禁止在堆中产生对象 ...

    Effective_C++_3rd笔记.pdf

    - **条款33至36**:讨论了继承中命名冲突的避免、非虚函数的重定义问题以及默认参数值的继承规则。 - **条款38**:介绍了复合(composition)作为一种替代继承的方式,用于表达“has-a”或“is-implemented-in-terms...

    侯捷译Scott Meyers的 More Effecitve C++

    - **Item 24: 理解虚拟函数、多继承、虚基类和RTTI所需的代价** - 这些特性虽然强大,但也带来了额外的运行时开销。 - 了解这些代价可以帮助开发者做出更好的设计决策。 **2.5 技巧(TECHNIQUES,又称IDIOMS或...

    Effective C++学习笔记

    7. **为多态基类声明virtual析构函数**:当基类需要被多态继承时,虚拟析构函数确保子类对象能正确地销毁。 8. **别让异常逃离析构函数**:析构函数应当处理可能抛出的异常,因为异常在析构函数中无法被捕获,可能...

    PT80-NEAT开发指南v1.1

    版权和许可条款 ...................................................................................................................................... 1 第二章 PT80 开发入门 ..............................

    matlab开发-ScrollPanel

    MATLAB支持面向对象编程,所以这个文件可能定义了一个名为`ScrollPanel`的类,该类继承自MATLAB的图形基类,并添加了特定于滚动面板的功能。可能包括构造函数、设置和获取属性的方法、以及处理用户交互的回调函数。...

    c#学习笔记.txt

    override提供从基类继承的虚拟成员的新实现。 readonly声明一个字段,该字段只能赋值为该声明的一部分或者在同一类的构造函数中。 sealed指定类不能被继承。 static声明属于类型本身而不是属于特定对象的成员。 ...

    PostgreSQL-tutorial-7.3.2.pdf

    它是在加州大学许可条款下分发的自由软件,用户可以免费使用、复制、修改及分发软件和其文档,但加州大学不承担因使用此软件而造成的直接、间接、特殊、偶然或后果性损失的责任。 文档内容涵盖了从安装PostgreSQL到...

Global site tag (gtag.js) - Google Analytics