C++中成员函数的重载、覆盖与隐藏

版权声明:本文为博主原创文章,未经博主允许严禁转载。 https://blog.csdn.net/EverestRs/article/details/84591385

成员函数被重载的特征:

(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。

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

(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual关键字。

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

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

例:

#include <iostream.h>
class Base
{
public:
     virtual	void  f(float x){ cout << "Base::f(float) " << x << endl; }
     void g(float x){ cout << "Base::g(float) " << x << endl; }
     void h(float x){ cout << "Base::h(float) " << x << endl; }
};

class Derived : public Base
{
public:
     virtual	void f(float x){ cout << "Derived::f(float) " << x << endl; }
     void g(int x){ cout << "Derived::g(int) " << x << endl; }
      void h(float x){ cout << "Derived::h(float) " << x << endl; }
};

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

pb->f(3.14f);	
pd->f(3.14f);	

pb->g(3.14f);	
pd->g(3.14f);	
 
pb->h(3.14f);	
pd->h(3.14f);	
}

/*
注意:
(1)函数Derived::f(float)覆盖了Base::f(float)。
(2)函数Derived::g(int)隐藏了Base::g(float),而不是重载。
(3)函数Derived::h(float)隐藏了Base::h(float),而不是覆盖。 
*/

运行结果:

Derived::f(float) 3.14 
Derived::f(float) 3.14
Base::g(float) 3.14
Derived::g(int) 3
Base::h(float) 3.14
Derived::h(float) 3.14

再看下面这个例子:

class Base
{
public:
	void f(int x);
};

class Derived : public Base
{
public:
	void f(char *str);
};

void Test(void)
{
	Derived *pd = new Derived;
	pd->f(10);	 // 出错
}

隐藏规则至少有两个存在的理由:
1.写语句pd->f(10)的人可能真的想调用Derived::f(char *)函数,只是他误将参数写错了。有了隐藏规则,编译器就可以明确指出错误。否则,编译器会静悄悄地将错就错,程序员将很难发现这个错误,留下祸根。
2.假如类Derived有多个基类(多重继承),有时搞不清楚哪些基类定义了函数f。如果没有隐藏规则,那么pd->f(10)可能会调用一个出乎意料的基类函数f。尽管隐藏规则看起来不怎么有道理,但它的确能消灭这些意外。

将程序进行如下修改就正确了

class Base
{
public:
	void f(int x);
};

class Derived1 : public Base
{
public:
	void f(char *str);
	void f(int x) { Base::f(x); }
}; 

void Test1(void)
{
	Derived1 *pd = new Derived1;
	pd->f(10);	 // 正确
}

猜你喜欢

转载自blog.csdn.net/EverestRs/article/details/84591385