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

mac2022-06-30  111

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

 

转载于:https://www.cnblogs.com/MzMxMyg/p/9591594.html

最新回复(0)