C++ 的重载(overload),重写(override), 重定义(redefining/hide)

来源:互联网 发布:有认识淘宝小二的吗 编辑:程序博客网 时间:2024/05/16 08:34
一、重载(overload)
实现重载要求函数名相同,但是参数表列 个数顺序类型不同。注意 不能通过返回类型来重载。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

(5)返回值可以不同;


二、重写(也称覆盖 override)
指在派生类中重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…

(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的


三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。


下面通过一个demo 来加深理解:

#include<iostream>class A {public:  void Func1(int a) {      std::cout << "class A: Func1" << std::endl;  }  virtual void Func2(int a) {      std::cout << "class A: Func2" << std::endl;  }  virtual void Func3(int a) {      std::cout << "class A: Func3" << std::endl;  }};class B : public A {public:  // redefining  void Func1(int a) {      std::cout << "class B: Func1" << std::endl;  }  // override  void Func2(int a) {    std::cout << "class B: Func2-1" << std::endl;  }  // overload  void Func2(int a, int b) {    std::cout << "class B: Func2-2" << std::endl;  }  // redefining  void Func3(char a) {    std::cout << "class B: Func3" << std::endl;  }};int main(int argc, char* argv[]){  B* b = new B;  b->Func1(1);  b->Func2(1);   //verify override  b->Func2(1, 1); // verify overload  b->Func3(1);  //verify redifining with different params  std::cout<<"Point A"<<std::endl;  A* a = new B;  a->Func1(1);  a->Func2(1);  //a->Func2(1, 1);  a->Func3('x');    return 0;}



参考:

http://glgjing.github.io/blog/2014/12/27/c-plus-plus-zhong-zai-,-zhong-xie-,-zhong-ding-yi-qu-bie/

http://www.cnblogs.com/tanky_woo/archive/2012/02/08/2343203.html

http://blog.csdn.net/yiya1989/article/details/17230867








阅读全文
0 0
原创粉丝点击