欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ 学习笔记 (八)重载 重写 重定义以及名字覆盖

程序员文章站 2022-07-02 13:48:00
学习C++必定会遇到重载、重写、重定义。概念的东西多也是学习C++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了。 概念,特点: 重载: 直白点说就是函数名字相同,传参的个数,类型不一样。判断标准在于传参是否相同。它有以下的特点: 1.重载只发生在同一类中。 2.子类不能重载父类的函数 3.在程序编 ......

  学习c++必定会遇到重载、重写、重定义。概念的东西多也是学习c++蛋疼之处,但是还是得弄懂,学懂了也就不觉得多了。

  

  概念,特点:

  

  重载:

    直白点说就是函数名字相同,传参的个数,类型不一样。判断标准在于传参是否相同。它有以下的特点:

    1.重载只发生在同一类中。

    2.子类不能重载父类的函数

    3.在程序编译期间,编译器将

  

  重写:

    1.发生在子类和父类之间

    2.子类虚继承(使用了virtual关键字)父类的同名函数,并且原型相同

  

  重定义:

    与重写唯一不同的在于没有使用virtual关键字  

  

  名称覆盖在后面的例程说明中进行解析。

  

  本次笔记通过以下两个类为例子说明:

  parent :                     child:

  void abc();                 void abc();

 virtual void func()              virtual void func(int i)
                         virtual void func(int i, int j)             
 1 class parent
 2 {
 3 public: 
 4     void abc()
 5     {
 6         printf("abc");
 7     }
 8 
 9     virtual void func() 
10     {
11         cout<<"func() do..."<<endl;
12     }
13 
14 };
15 
16 
17 class child : public parent
18 {
19     
20 public: 
21     void abc()
22     {
23         printf("child abc");
24     }
25 
26     virtual void func(int i)
27     {
28         cout<<"func(int i) do..."<<i<< " "<<j<<endl;
29     }
30     virtual void func(int i, int j, int k)
31     {
32         cout<<"func(int i, int j) do.."<< endl; 
33     }
34 
35 };

 

    例程说明:

  父类定义了两个函数:abc 和 func 

 

  1.子类中的abc与父类abc有相同原型,没有使用virtual关键字,属于重定义

 

  2.假如父类中的函数abc 声明为    virtual void abc();   那么子类则是重写函数abc

 

  3.子类的func函数定义了两个传参不同的func函数,这两个函数属于重载

  

  4.名字覆盖

 

  在main函数中执行以下代码:

    child c;

    c.func();

  4.1.将会提示:无法重载父类函数。编译失败。

  4.2.在继承中子类可以调用父类的公有函数,在这里因为在子类已经有了名字为func的函数(传参不同),那么编译器会认为这是子类在重载父类的函数,在上面的概念特点描述中第一点                 已经说明重载只发生在同一类中,所以重载失败

  4.3.不能直接调用父类函数是因为,子类有同名的函数,这就名字覆盖。

  4.4.这种情况下如果仍要调用父类的func函数可以通过作用域符号进行解决:

    c.parent::func();