C++ 函数 重载 覆盖 隐藏

来源:互联网 发布:光盘数据循环冗余错误 编辑:程序博客网 时间:2024/05/29 10:11

在C++的类中函数定义的时候会有 重载,覆盖(也成为重写),隐藏(也成为重定义)三种情况下面说说他们的区别,以及一些注意事项:


学习C++中的类,主要有两种,一种是用struct 关键字 定义的,默认情况下类中的成员是public属性,而另一种使用class 关键字 定义的默认是private属性的。


子类在继承的时候会将父类中的public protect private资源全部继承,但是在子类中是不能访问private 的资源的,至少是不能直接访问的,可以通过public 的函数来实现访问。


C++中定义类的时候,占据空间的主要是包含类中的成员变量,而类中的成员函数是不占用空间的,但是虚函数占用一个4字节大小的空间,这是一个虚函数表指针,是一个定义了类中的虚函数的地址的表,能够解决类中的多态,覆盖,继承中的问题。


1、重载(overload)

首先,重载是发生在同一个作用域中,也就是同一个类中。而不是基类和子类中,用来实现多态机制。

重载发生的条件:

A:在同一个类中的 两个函数的 函数名必须相同,函数参数必须不同,返回值类型可以相同也可以不同;

注意:

  • 只能通过不同的参数样式进行重载,例如:不同的参数类型,不同的参数个数,不同的参数顺序;
  • 不能通过访问权限、返回类型、抛出的异常进行重载;
  • 重载的函数应该在相同的作用域下;
2、覆盖
首先、覆盖发生在子类和基类之间,是子类的函数覆盖掉了父类的函数,因为在继承的时候子类会将父类中的一些有权限继承的资源,全部继承下来,当子类中需要对一些函数重新定义的时候则有可能发生覆盖或者隐藏,因为覆盖的发生需要一些特定的条件
条件:
A:重写的函数和被重写的函数必须为virtual函数,分别位于基类和派生类中;
B:重写的函数和被重写的函数函数名和函数参数必须一致;
C:重写的函数和被重写的函数返回值相同,或者都返回指针或引用,并且派生类虚函数所返回的指针或引用的类型是基类中被替换的虚函数所返回的指针或引用的类型的子类型。

注意:
  • 重写的函数所抛出的异常必须和被重写的函数所抛出的异常一致,或者是其子类;
  • 重写的函数的访问修饰符可以不同于被重写的函数,如基类的virtual函数的修饰符为private,派生类改为public或protected也是可以的。
  • 静态方法不能被重写,也就是static和virtual不能同时使用。
  • 重写的函数可以带virtual关键字,也可以不带。
3、隐藏
子类重新定义了父类中的非虚函数,屏蔽掉了父类中的同名函数;
条件:
  • 被隐藏的函数之间作用域不相同
注意:
  • 子类和父类的函数名称相同,但参数不同,此时不管父类函数是不是virtual函数,都将被隐藏。
  • 子类和父类的函数名称相同,参数也相同,但是父类函数不是virtual函数,父类的函数将被隐藏。


0 0
原创粉丝点击