Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180669
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 69
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-18 13:11
文章分类
文章存档

2013年(64)

我的朋友

分类: C/C++

2013-07-24 11:33:50

首先先给出定义吧
重载:同一个类中,函数名相同但是参数不同,不管是否有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. }

阅读(1460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~