请考虑下面两个类:
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 and overload difference
Override Overload Overwrite 马克-to-win Java视频
overload and override.txt的区别重载和隐藏的区别
本文详细地描述了overload 和override的区别
Delphi面向对象:overload与override[文].pdf
Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;...
7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14....
C#中方法的重写(override)和重载(overload)的区别
重写(Override)概述 Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类...
7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14....
7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14....
重载overload,这个概念是大家熟知的。在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制就是重载
方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本
7、override 和 overload 的区别? 9、new 修饰符是起什么作用? 10、this 关键字的含义? 11、可以使用抽象函数重写基类中的虚函数吗? 12、密封类可以有虚函数吗? 13、如果基类中的虚属性只有一个属性访问器,...
Java基础的笔试题 String 和StringBuffer 的区别 运行时异常与一般异常有何异同? Collection 和 Collections 的区别 ...Overload 和Override 的区别。Overloaded 的方法是否可以改变返回值的类型?
7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个...
7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个...
java
18、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? 7 19、构造器Constructor是否可被override? 7 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类...