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

  学习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();

 

posted @ 2018-09-05 13:32  马儿的大烟枪  阅读(541)  评论(0编辑  收藏  举报