`
webcode
  • 浏览: 5912102 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

重载(overload)、覆盖(override)与隐藏

 
阅读更多
重载(overload)用于同一个类中的成员函数,其特征为:
(1)相同的范围(在同一个类中);
(2)相同的函数名字;
(3)参数不同(包括参数类型不同,或参数个数不同,或两者都不同。注意:和返回值没关系);
(4)和是否为虚函数无关。
覆盖(override)是指派生类函数覆盖基类函数,其特征为:
(1)不同的范围(分别位于派生类与基类);
(2)相同的函数名字;
(3)参数相同(即参数类型和参数个数均相同);
(4)基类函数必须是虚函数。
隐藏(hide)是指派生类的函数屏蔽了与其同名的基类函数,其特征为:
(1)不同的范围(分别位于派生类与基类);
(2)相同的函数名字;
(3)若参数不同,基类函数无virtual关键字,基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载);
(4)若参数不同,基类函数有virtual关键字。基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载;因为参数不同,所以是隐藏而不是覆盖);
(5)若参数相同,基类函数无virtual关键字。基类函数将会被隐藏。(因为基类函数不是虚函数,所以是隐藏而不是覆盖)。
(6)若参数相同,基类函数有virtual关键字。如果基类函数有多个重载版本,且派生类并没有重写所有的同名虚函数,当在派生类中调用函数时,基类中未被重写的虚函数将被隐藏。(当然,被重写的函数就是覆盖了)。
注意: 如果想在派生类中调用基类中的被隐藏的函数,可以在派生类中填写如下代码:using Base::Fun2;


#include <iostream.h>

class Base
{
public:
// overload between Fun1() and Fun1(int i)
void Fun1()
{
cout<<"Base::Fun1()"<<endl;
}

void Fun1(int i)
{
cout<<"Base::Fun1(int i)"<<endl;
}

// overload between Fun2() and Fun2(int i)
virtual void Fun2()
{
cout<<"Base::Fun2()"<<endl;
}

virtual void Fun2(int i)
{
cout<<"Base::Fun2(int i)"<<endl;
}
};

class Derive : public Base
{
public:
//using Base::Fun2;

// overload between Fun1(int i, int j) and Fun1(int i)
// hide-3
void Fun1(int i, int j)
{
cout<<"Derive::Fun1(int i, int j)"<<endl;
}

// hide-5
void Fun1(int i)
{
cout<<"Derive::Fun1(int i)"<<endl;
}

// overload between Fun2(int i, int j) and Fun2(int i)
// hide-4
virtual void Fun2(int i, int j)
{
cout<<"Derive::Fun2(int i, int j)"<<endl;
}

// override Base::Fun2(int i)
// hide-6
void Fun2(int i)
{
cout<<"Derive::Fun2(int i)"<<endl;
}
};

void main()
{
Derive d;
Base *pb = &d;
Derive *pd = &d;

pb->Fun1(); // Base::Fun1()
pb->Fun1(1); // Base::Fun1(int i)
pb->Fun2(); // Base::Fun2()
pb->Fun2(1); // Derive::Fun2(int i)

cout<<endl;
pd->Fun1(1, 2); // Derive::Fun1(int i, int j)
pd->Fun1(1); // Derive::Fun1(int i)
// error: no overloaded function takes 0 parameters
// hide-3 or hide-5 can hide this base function
// pd->Fun1();

pd->Fun2(1, 2); // Derive::Fun2(int i, int j)
pd->Fun2(1); // Derive::Fun2(int i)
// error: no overloaded function takes 0 parameters
// hide-4 or hide-6 can hide this base function
// pd->Fun2();
}

附:在C#中,编译器已经可以对隐藏发出2级警告。

分享到:
评论

相关推荐

    overload and override.txt的区别

    overload and override.txt的区别重载和隐藏的区别

    overload and override

    本文详细地描述了overload 和override的区别

    重写(override)和重载(overload)的区别

    C#中方法的重写(override)和重载(overload)的区别

    C++中Overload,Override,Hide之间的区别

    重载overload,这个概念是大家熟知的。在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载

    Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本

    PHP和JAVA中的重载(overload)和覆盖(override) 介绍

    重载:同一个类中,函数名一样,返回值或者参数类型,个数不一样的叫做重载。 覆盖:同名函数,同返回值类型,同参数的叫做覆盖。指的是子类对父类中方法的覆盖。 PHP不支持方法和操作符重载。JAVA不支持操作符的...

    C++中overload,override,overwrite的区别详细解析

    Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。 Overwrite(重写):是指派生类的函数屏蔽...

    PHP中overload与override的区别

    override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被...

    Java重写(Override)&重载(Overload).pdf

    重写(Override)概述 Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类...

    Java 重写(Override)与重载(Overload).pdf

    java

    C++中的重载、覆盖、隐藏介绍

    一、重载(overload) 指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。 (1)相同的范围(在同一个作用域中) ; (2)函数名字相同; (3)参数不同; (4)virtual 关键字...

    java 重载(overload)与重写(override)详解及实例

    主要介绍了java 重载(overload)与重写(override)详解及实例的相关资料,并附实例代码,需要的朋友可以参考下

    Java重写(Override)与重载(Overload)区别原理解析

    主要介绍了Java重写(Override)与重载(Overload)区别原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Android面试题

    方法重载与覆盖的区别?( Overload与Override的区别) String 和StringBuffer的区别 抽象类与接口的区别(abstract与interface的区别)

    C++背题大纲1

    1.虚函数 2.纯虚函数 3.内存泄漏 内存溢出 野指针 4.访问控制 5.类中对象分布 6.overload重载 override覆盖 overwrite重写

    java面试题

    重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象...

    PHP重载基础知识回顾

    先区分一下重载(overload)和重写(override):重载指多个名字相同,但参数不同的函数在同一作用域并存的现象;重写出现在继承中,指子类重定义父类功能的现象,也被称为覆盖。重载中说的参数不同有三种情况:参数个...

Global site tag (gtag.js) - Google Analytics