分享

C++ 重载,重定义(覆盖),重写名字隐藏

 XX_YY_ZZ 2015-11-02

分类: C/C++

首先先给出定义吧
重载:同一个类中,函数名相同但是参数不同,不管是否有virtual关键字。
重定义:不同类中(特指基类和子类)函数名相同。但是参数列表和返回值不一定相同。
重写(覆盖):基类函数有virtual关键字,且函数名、参数列表、返回值都相同。属于重定义一种。
名字隐藏:如果对基类的某一成员函数的版本在子类中重定义,那么基类中该函数的版本将被隐藏。
看个小程序。


点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. class Base {
  5. public:
  6.     virtual void mf1()    
  7.     {
  8.         cout << "Base::virtual void mf1()" << endl;
  9.     }
  10.     virtual void mf1(int)        //重载mf1() virtual函数
  11.     {
  12.         cout << "Base::virtual void mf1(int)" << endl;
  13.     }
  14.     int f() const
  15.     {
  16.         cout << "Base::f()\n";
  17.         return 1;
  18.     }
  19.     int f(string) const        //重载f()函数
  20.     {
  21.         cout << "Base::f(string)" << endl;
  22.         return 1;
  23.     }
  24. };

  25. class Derived : public Base {
  26. public:
  27.     using Base::f;        //使用using关键字让f()函数可见
  28.     virtual void mf1()    // 重写基类虚函数
  29.     {
  30.         cout << "Derived::virtual void mf1()" << endl;
  31.     }
  32.     int f(int)    //重定义f()函数, 可以改变其参数列表
  33.     {
  34.         cout << "Derived::f(int) const\n";
  35.     }
  36. };


  37. class Derived2 : public Base {
  38. public:
  39.     void f()    //重定义f()函数, 可以改变其返回值
  40.     {
  41.         cout << "Derived2::f() const\n";
  42.     }
  43. };

  44. int main()
  45. {
  46.     Derived d;
  47.     Derived2 d2;
  48.     int x = 10;
  49.     string str = "hello";
  50.     
  51.     
  52.     d.mf1();        ///调用派生类中的函数
  53. //!    d.mf1(x);        ///派生类重写了基类中的mf1虚函数,则基类中其他版本的函数都被隐藏了
  54.     d.f(x);            ///调用派生类中的函数
  55.     d.f();
  56.     
  57.     d2.f();
  58. //!    d2.f(str);        ///派生类重定义基类中的f函数,则基类中其他版本的函数都被隐藏了
  59. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多