zoukankan      html  css  js  c++  java
  • 条款36:绝不重新定义继承而来的非虚函数

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class Base
     6 {
     7 public:
     8     void mf();
     9 };
    10 void Base::mf()
    11 {
    12     cout << "Base::mf" << endl;
    13 }
    14 
    15 class Derived : public Base
    16 {
    17 public:
    18     void mf();
    19 };
    20 void Derived::mf()
    21 {
    22     cout << "Derived::mf" << endl;
    23 }
    24 
    25 int main()
    26 {
    27     Derived d;
    28 
    29     Base* pB = &d;
    30     pB->mf();           // 调用Base::mf
    31     Derived* pD = &d;
    32     pD->mf();           // 调用Derived::mf
    33 
    34     return 0;
    35 }

    说明:同样都指向d,但是却调用了不同的函数,原因是非虚函数是静态绑定的,即调用哪个函数是由声明时所决定的。而虚函数是动态绑定的,调用哪个函数是由运行时指向的对象决定的

    如上所述,如果重新定义了继承而来的非虚函数,那么得到的结果可能并不是你想要的;如果确实需要重新实现自己的函数版本,那么定义为虚函数好了。

  • 相关阅读:
    AdaBoost算法学习
    梯度下降与随机梯度下降
    Logistic Regression学习
    PCA算法
    VS2013常见错误排查
    K临近算法
    遗传算法小结
    SLIC超像素(superpixel)算法
    openslide api函数概要
    线程钩子
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4525519.html
Copyright © 2011-2022 走看看