浅尝C++中重载、隐藏和覆盖

一、重载

  首先,对比C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制,重载便是这四种新机制之一。类似自然语言,一词可以多义,在C++中,可以把语义、功能相似的几个函数用同一个名字表示,即函数重载。

  重载的实现:可以通过函数的参数实现重载。注意:区分函数是否重载只能通过函数的参数而不能仅仅靠返回值。因为在C/C++中函数的返回值可以被忽略。

  例如:void Function(void);

     int Function(void);

     通过int x = Function();

     这里即无法判断到底调用了哪个函数。

  注意:并不是函数名相同就构成了重载,全局函数和类成员函数的同名就不算重载,因为函数的作用域不同。

  如:void Print(...);

    class A

    {

      void Print(...);

    }

    函数的重载还应该注意的是发生隐式类型转换而导致二义性的产生。如下代码

#include<iostream>
using namespace std;

void output( int x); // 函数声明
void output( float x); // 函数声明

void output( int x)
{
    cout << " output int " << x << endl ;
}
void output( float x)
{
    cout << " output float " << x << endl ;
}

void main(void)
{
    int x = 1;
    float y = 1.0;
    output(x); // output int 1
    output(y); // output float 1
    output(1); // output int 1
    output(0.5); // error! ambiguous call, 因为自动类型转换
    output(int(0.5)); // output int 0
    output(float(0.5)); // output float 0.5
}

二、覆盖

  覆盖是指派生类函数覆盖基类函数,特征是:

  1、不同的范围(分别位于派生类和基类);

  2、函数的名字相同;

  3、参数相同;

  4、基类函数必须有Virtual关键字

三、隐藏

  隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

  1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。(易与重载混淆)

  2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。(易与覆盖混淆)

更多实例详见《高质量C++编程》

时间: 2024-11-08 20:55:53

浅尝C++中重载、隐藏和覆盖的相关文章

【C++】继承中的隐藏与覆盖

没有访问控制符时默认为私有继承. 当基类中的某个函数有若干个重载版本,继承类中也实现了该函数的某个重载版本时,参数完全相同的基类版本被覆盖,基类的其他版本被隐藏. 1.若要在继承类中使用基类的被覆盖方法,用:: 如B继承A, B b;   b.A::fun(); 调用的就是被覆盖的基类方法 2.若要在继承类中使用基类的被隐藏方法:  b.A::fun(1,,2); 调用的就是被隐藏的基类方法 在B中声明 using A::fun; 3.在私有继承的派生类中把基类的公有函数转变为公有函数 在B中的

隐藏和覆盖的区别和用法

讲隐藏和覆盖之前先看两个概念:静态类型和动态类型. 任何一个引用变量都有两个类型:一个叫静态类型,也就是定义该引用变量的类型:另一个叫动态类型,也就是该引用实际指向的对象类型. 比如对于两个类A和类B,有:A a=new B(): 那么,引用a的静态类型就是A,动态类型就是B. java中引用的静态类型在编译的时候就可以确认,但是编译器无法得知这个引用的动态类型:只有当程序运行时,通过RTTI就可以检查出引用的动态类型. 再介绍一下,java中绑定的概念:对于一个程序,可以有很多的方法.这些方法

C++中重载、重写(覆盖)和隐藏的区别实例分析

这篇文章主要介绍了C++中重载.重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int

C++中的虚继承 &amp; 重载隐藏覆盖的讨论

虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,可以将B1.B2对A的继承定义为虚拟继承,而A就成了虚拟基类.实现的代码如下: class A class B1:public virtual A; class B2:public virtual A; class D:public

类中函数的重载、隐藏和覆盖

函数重载只会发生在同一个类中,函数名相同,只能通过参数类型,参数个数或者有无const来区分.不能通过返回值类型区分,而且virtual也是可有可无的,即虚函数和普通函数在同一类中也可以构成函数重载. 基类和派生类中只能是隐藏或者覆盖.1)隐藏是指派生类中有函数与基类中函数同名,但是没有构成虚函数覆盖,就是隐藏. 隐藏的表现:若基类中函数func()被派生类中函数func()隐藏,那么无法通过派生类对象访问基类中的func() 函数,派生类对象只能访问到派生类中的func()函数.不过基类中的f

java中重载、覆盖和隐藏三者的区别分析

重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg:void a ()和int a() ,如果调用a(),出现歧义) 3.main方法也是可以被重载的 覆盖:子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同 两同两小一大  注意:子类实例方法不能覆盖父类的

C++中重载(overload)、覆盖(override)与隐藏(oversee)

body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(

C++父子类继承时的隐藏、覆盖、重载

存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承关系: 子类复制父类全部成员 首先,理解父子类的继承关系是怎样发生的.在此基础上就很容易理解它们之间的关系和区别. 每一个类有它自己的成员变量和成员函数,是一个独立的空间整体.当子类继承父类时,会将父类的全部成员全部复制一份,作为子类的成员,但是,同时也会标记这些成员是从父类中继承的,与子类本身的成

C++多态,继承,重载,隐藏,覆盖的关系

override->重写(=覆盖).overload->重载.polymorphism -> 多态 override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法.成员函数的重载(overload).覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 1   重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中: (2)函数名字相同: (3)参数不同: (4)virtual