C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?

1)重载(overload):

指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

a 相同的范围(在同一个类中)

b 函数名字相同、 参数不同

c virtual关键字可有可无

d 返回值可以不同;

2) 重写(覆盖override)是指派生类函数覆盖基类函数,特征是:

a 不同的范围,分别位于基类和派生类中

b 函数的名字相同、 参数相同

c 基类函数必须有virtual关键字,不能有static

d 返回值相同(或者协变),否则报错;

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

3) 重定义(隐藏redefine)是指派生类的函数屏蔽了与其同名的基类函数,特征是:

a 不在同一个作用域(分别位于派生类与基类)

b 函数名字相同

c 返回值可以不同

d 规则:

如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏;

如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。

ps: 多态性可以分为静态多态性(方法的重载,一个类)和动态多态性(方法的覆盖,有继承关系的类之间的行为)。进而多态性可以由重载和覆盖来实现。

例子:

class Base {
private:
 <span style="color:#ff0000;">virtual</span> void display() { cout<<"Base display()"<<endl; }
 void say(){ cout<<"Base say()"<<endl; }
public:
 void exec(){ display(); say(); }
 void f1(string a) { cout<<"Base f1(string)"<<endl; }
 void f1(int a) { cout<<"Base f1(int)"<<endl; } //<span style="color:#ff0000;">overload,两个f1函数在Base类的内部被重载</span>
};

class DeriveA:public Base{
public:
 void display() { cout<<"DeriveA display()"<<endl; } //<span style="color:#ff0000;">override,基类中display为虚函数,故此处为重写</span>
 void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; } //<span style="color:#ff0000;">redefine,f1函数在Base类中不为虚函数,故此处为重定义</span>
 void say() { cout<<"DeriveA say()"<<endl; } //<span style="color:#ff0000;">redefine,同上</span>
};

class DeriveB:public Base
{
public:
 void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //<span style="color:#ff6666;">redefine,重定义</span>
};

int main(){
 DeriveA a;
 Base *b=&a;
 b->exec(); //display():version of DeriveA call(polymorphism) //say():version of Base called(allways )

 <span style="color:#ff0000;">b里边的函数display被A类覆盖,但是say还是自己的</span>。

 a.exec(); //same result as last statement
 a.say();
 DeriveB c;
 c.f1(1); //version of DeriveB called
}

执行结果:

DeriveA display()
Base display()
DeriveA display()
Base display()
DeriveA display()
DeriveB f1(int)

参考链接:

http://blog.163.com/[email protected]/blog/static/111352259201102441934870/

http://www.cnblogs.com/kevinGaoblog/archive/2012/08/25/2656989.html

时间: 2024-10-05 20:32:48

C++中重载(overload)、重写(override,也叫做“覆盖”)和重定义(redefine)的区别?的相关文章

重载overload &amp; 重写 override

先说说面向对象3大特性 封装   //主要是由密封类,public/protect/private/Internal 来实现,通过不同的访问级别来控制 继承   //说的就是派生 多态   //多态性主要有override和overload来实现 override & overload重载叫overload,重写叫override: 重载某个方法是在同一个类中发生的! 重写是在子类中重写父类中的方法. 1.override: 父类:public virtual string ToString()

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

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

java中重载与重写浅析

java中重载与重写浅析 Overloading (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以

c++ 重载,覆盖,重定义

函数重载(Function Overloading) C++允许同一范围(scope)(在同一个类中)内具有多个名称相同的函数.这些函数成为重载函数(overloaded function). C++ 使用函数声明的  参数数量,参数类型,省略号存在或缺失(Presence or absence of ellipsis),const 或 volatile 来区分同一范围内具有相同名称的函数组. 覆盖(override,重写): 子类重写定义基类中有相同名字相同参数的虚函数. 不同范围内(特指基类

java中重载和重写

java中经常会有面试题考一些重载和重写的知识下面分析二者各自特性以及如何区分 (1)重载 (overload) 定义:java中允许方法名相同,但是参数列表不同,我们称之为方法的重载: 我们可以把 方法名 和 参数列表 定义为 方法签名:也就是方法签名包含方法名和参数列表两部分:一个类中是不可以有方法签名相同的两个方法,否则会报错的: 方法重载的意义:就是同一方法名根据传入的参数不同会有不同的方法功能:   具体举例就像超市的收银台可以收现金,可以刷卡,可以支付宝:可以微信,可以超市购物卡:收

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

函数重载: 在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,即函数重载. 重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. class A{ public: void test(int i); void test(double i); void test(int i, double j); void test(double i, int j); int te

C++中的Overload、Override和Overwrite

在C++语言中有一组基础的概念一直都容易混淆:Overload.Override和Overwrite分别表示什么意思?下面把这三个概念整理一下: 1. Overload(重载) 重载的概念最好理解,在同一个类声明范围中,定义了多个名称完全相同.参数(类型或者个数)不相同的函数,就称之为Overload(重载).重载的特征如下: (1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. 2. Override(覆盖) 覆盖的概念其实是用来实现C+

c++中重载,重写,覆盖

1.重载 重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列表(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 相同的范围(在同一个作用域中) 函数名字相同 参数不同列表 virtual 关键字可有可无 返回值可以不同 int test(); int test(int a); int test(int a,double b); int test(double a,int a); int test(string s); ..

java中重载和重写的区别

重载和重写的英文名字: 重载overload. 重写override. 其实把重载和重写放到一起比较本身没有太大的意义.因为: (1)重载主要发生在同一个类的多个同名方法之间 (2)重写发生在子类和父类的同名方法之间. 他们除了方法名相同之外,没有太大相似之处. 此外,子类和父类之间也会发生重载.如果子类定义了一个与父类相同名字的方法,但是参数列表不同的方法,那么就会形成子类方法和父类方法的重载.