`
wx1569567608
  • 浏览: 59795 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Override? Overload?

 
阅读更多

请考虑下面两个类:

class CBase

{

public:

    virtual void Func(int *piVal) {...}

    virtual void Func(float fVal) {...}

}

class CChild : public CBase

{

public:

    virtual void Func(float fVal) {...}

}

void main(void)

{

    int i = 0;

    CBase *pB = new CChild;

    CChild *pC = new CChild;

    pB->Func(&i);

    pB->Func(0.0f);

    pC->Func(&i);

    pC->Func(0.0f);

......

}

请回答我,main里面的4个Func调用,都能获得C++编译器认可吗?

被认可的调用里,分别都调哪个版本的Func函数?

说实话,这个问题,如果前天问我,我肯定答错。

先公布答案:

pB->Func(&i);      可以编译      调用CBase::Func(int *piVal)

pB->Func(0.0f);   可以编译      调用CChild::Func(float fVal)

pC->Func(&i);      不可以编译   ----

pC->Func(0.0f);   可以编译      调用CChild::Func(float fVal)

您答对了吗?原因是这样的:

pB->Func(0.0f)和pC->Func(0.0f)都可以编译,这个没什么可说的。它们都调用CChild::Func(float fVal),这正是“多态”的一种体现。我们也可以称这种现象为“晚绑定”。

pB->Func(&i);可以编译,这可能有人要说,这不是废话吗?但pC->Func(&i);为什么不能编译呢?

原来C++的设计者,为了避免“参数重载(Overload)”和“虚函数覆盖(Override)”在同一条继承路线上的不同层级同时发生,以致产生混乱,特意阻止了这样情况发生,他们定义了如下一条规矩,用白话可以这样说:

“覆盖(Override)”可以(并只能)发生在父子类之间;

“重载(Overload)”只发生在同一个类之内,不能夸继承层级发生。

当通过子类指针访问类对象时,如果子类拥有与父类重名的函数,则从子类的视角看,只能看到“覆盖(Override)”的发生,而看不到“重载(Overload)”了。

转载于:https://my.oschina.net/u/158055/blog/694450

分享到:
评论

相关推荐

    Override-Overload

    override and overload difference

    Override,Overload,Overwrite的区别---马克-to-win Java视频

    Override Overload Overwrite 马克-to-win Java视频

    overload and override.txt的区别

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

    overload and override

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

    Delphi面向对象:overload与override[文].pdf

    Delphi面向对象:overload与override[文].pdf

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

    Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;...

    C#25个问题 静态成员和非静态成员的区别等等

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14....

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

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

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

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

    C#基础概念二十五问

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14....

    C#的25个问题(内附代码示例)

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14....

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

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

    Java overload和override的区别分析

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

    C#基础概念.doc

    7、override 和 overload 的区别? 9、new 修饰符是起什么作用? 10、this 关键字的含义? 11、可以使用抽象函数重写基类中的虚函数吗? 12、密封类可以有虚函数吗? 13、如果基类中的虚属性只有一个属性访问器,...

    Java基础的笔试题

    Java基础的笔试题 String 和StringBuffer 的区别 运行时异常与一般异常有何异同? Collection 和 Collections 的区别 ...Overload 和Override 的区别。Overloaded 的方法是否可以改变返回值的类型?

    常见 ASP.NET 概念(开源,说明)

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个...

    c#基础学习问答c#基础学习问答

    7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个...

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

    java

    java面试宝典

    18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 7 19、构造器Constructor是否可被override? 7 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类...

Global site tag (gtag.js) - Google Analytics