`
kmplayer
  • 浏览: 512407 次
  • 性别: 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,一个结论:无论什么情况下,都不应该重新定义一个继承而来的非虚拟函数.
分享到:
评论

相关推荐

    C++面向对象技术完全剖析_源代码(继承,封装,多态,虚函数,纯虚函数,虚拟继承,多重继承,函数重载,指针……)

    1。多继承 基类 派生类(还要有多个父类) 第二条:涉及构造和析构 ... 水平方向上:体现出继承顺序 先虚拟继承 再普通继承 通过实例化类 体现对象构造和析构的顺序 还要有函数重载 指针 指针悬挂 无参函数等问题....

    C++结构体/函数定义转换C#函数定义/结构体

    本文将深入探讨如何将C++的结构体、数据类型和函数定义转换为C#,并结合提供的文件列表,讨论可能涉及的工具和技术。 首先,C++和C#虽然都是面向对象的编程语言,但在语法和类型系统上有显著差异。C++支持模板、...

    C++ 虚继承对基类构造函数调用顺序的影响

    可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;  ...

    Effictive STL CHM中文版

    条款37: 用accumulate或for_each来统计序列 仿函数,仿函数类,函数等等 条款38: 把仿函数类设计成值传递的 条款39: 用纯函数做predicate 条款40: 增强仿函数类的适应性 条款41: 明确ptr_fun, mem_fun和mem_fun...

    通过函数指针调用C++非静态成员函数

    ### 通过函数指针调用C++非静态成员函数 在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0...

    第六章Python函数习题及答案--中文

    6.16 节变量的范围:函数内定义的变量称为局部变量,而函数外定义的变量称为全局变量。 6.17 节变量的范围:函数外定义的变量称为全局变量,而函数内定义的变量称为局部变量。 6.18 节变量的范围:尽可能避免使用...

    用c++ 定义一个车(Vehicle)基类,有Run,Stop等成员函数,由此派生出自行车(bicycle)类,汽车(motorcar)

    我们将深入探讨面向对象编程中的继承、多态性、虚函数及其应用,并通过具体代码示例来展示这些概念。 ### 1. C++ 类与对象基础 在C++中,类是一种用户定义的数据类型,它可以包含数据成员和成员函数。数据成员通常...

    Benchmark functions 优化算法测试函数

    9. **Griewank.m**:Griewank函数是一个非凸、多模态函数,它的全局最小值位于原点,而局部最小值在整个定义域内广泛分布。 这些函数的设计目的是全面地测试优化算法的各个方面,包括全局搜索、局部搜索、收敛速度...

    C++随堂测试(继承、多态、重载)(答案).docx

    函数重载是指多个函数具有相同的名称但具有不同的参数列表,而运算符重载是指对运算符的重新定义。多态性可以在编译时和运行时实现,运行时多态性需要使用虚函数。 3. 重载:C++中的重载可以分为函数重载和运算符...

    php构造函数的继承方法

    如果子类没有定义自己的构造函数,那么它会默认继承父类的构造函数。这意味着当创建子类的实例时,父类的构造函数会被调用。例如: ```php class A { public $name; function __construct() { echo $this->name ...

    建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。

    还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:...

    解析C++中的虚拟函数及其静态类型和动态类型

    虚拟函数是C++语言引入的一个很重要的特性,它...各派生类在声明为基类的派生类时,默认继承了这些非虚拟成员函数的声明/实现,如同默认继承基类的数据成员一样,而不必另外做任何声明,这就是继承带来的代码重用的优点

    C++期末复习(杭州电子科技大学).ppt

    * 构造函数、析构函数、复制构造函数:构造函数的作用、析构函数的作用、复制构造函数的作用、参数初始化列表等。 * this 指针的定义及作用:this 指针的定义、this 指针的作用等。 第 4 章 * 派生类的声明方式:...

    fmincon函数仿真实例

    通过以上实例,我们了解了如何使用MATLAB的 `fmincon` 函数来解决非线性最小化问题,并且涉及到目标函数、线性和非线性约束条件的定义与应用。在实际工作中,`fmincon` 函数可以帮助我们解决许多复杂的优化问题,...

    复变函数与积分变换 pdf

    - **解析函数的性质**:解析函数具有许多重要性质,如解析函数在其定义域内的导数也是解析的,且解析函数在其定义域内具有无穷阶导数。 #### 三、复变函数的积分 - **曲线积分**:在复平面上沿着一条路径对复变函数...

    多型与虚拟

    - **重写(Override)**:派生类重新实现基类的虚函数,使得在派生类中该函数的行为有所不同。 #### 4. C++中的虚析构函数 - **虚析构函数**:在基类中声明虚析构函数是非常重要的,这样可以确保通过基类指针删除...

    C语言标准函数库详解.pdf

    头文件提供了一组非局部跳转函数,例如:setjmp()函数,用于实现非局部跳转。头文件提供了一组信号函数,例如:signal()函数,用于捕捉信号。头文件提供了一组可变参数表函数,例如:va_start()函数,用于实现可变...

    实变函数 (周民强).pdf

    6. 积分运算:包括极限函数的积分、函数的绝对连续性、Lp空间等概念和性质。 7. 微分和积分的交换性问题:研究在什么条件下,可以将微分和积分的运算顺序进行交换,例如勒贝格定理和牛顿-莱布尼茨公式。 8. 多维实...

    实验8 继承与派生.doc

    因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。 继承是一种非常重要的机制,它使得我们可以在已定义的类的基础上产生新类,提高了代码的重用性和可维护性。但是,继承也需要我们小心处理...

Global site tag (gtag.js) - Google Analytics