匪夷所思的C++重载、覆盖以及隐藏

转载 2012年03月29日 10:50:41

注:以下程序在win7平台下的VS2010中编译并且运行。

 

重载、覆盖以及隐藏的规则:

重载出现在相同作用域中的两个函数,如果具有相同的名字,而形参表不同,则成为函数重载。

     特征:1. 相同的范围。2. 函数名字相同。3. 参数不同。 4. Virtual关键字可有可无。

覆盖特征:1. 不同的作用域。 2. 相同的函数名字。 3. 参数相同。 4. 基类函数必须有virtual关键字。

隐藏1. 如果派生类的函数和基类的函数同名,但是参数不同,此时无论有无virtual关键字,基类的函数将被隐藏。2. 派生类的函数与基类函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时,基类的函数被隐藏。

示例代码:

1. 重载与覆盖

#include <iostream>
using namespace std;

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

class Derived : public Base{
public:
	virtual void g(int number = 20){ cout << "Derived::g(int) number " << number << endl; }
};

int main( void )
{
	Derived d;
	Base *pb = &d;
	pb->f(42);	// Base::f(int) 42
	pb->f(3.14f);	// Base::f(float) 3.14
	pb->g();		// Derived::g(int) number 10
	d.g();		// Derived::g(int) number 20
	return 0;
}

输出为:

其中重载比较容易理解,派生类继承了基类的两个f函数,调用时,根据参数的不同而调用不同的函数。

g(int)满足了覆盖的条件,在调用时执行的是派生类中的函数,值得注意的是,使用pb->g()调用的时候,number的参数是基类中的默认参数。使用d.g()调用的时候使用的number参数才是派生类中的默认缺省参数。

2. 隐藏与重载以及覆盖的区别

#include <iostream>
using namespace std;

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; }
};

int main()
{
	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);
}


输出:

C++中覆盖、重载、隐藏的概念

成员函数的重载,覆盖(改写)和隐藏 成员函数被重载的特征是: 1、具有相同的作用域,即在同一个类申明中。 2、返回值相同,函数的参数不同。 3、同名const方法和非const方法之间的重载不...

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

这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载、重写(覆盖)和隐藏的区别,对于C++面向对象程序设...

浅谈C++重载、重写和隐藏、覆盖

重写和重载的区别 重写是发生在两个类当中的,重载是在同一个类当中。 重写函数和被重写函数参数列表一定相同,而重载函数和被重载函数参数列表一定不同。(注意:仅返回值不同不能看作重载) 重写的基类中被重写...

C++ 重载 覆盖 隐藏

一,重载的定义 在同一可访问区内被声名的几个具有不同参数列表的(参数的类型、个数、顺序不同)同名函数,编译器会根据不同的参数列表来确定具体调用哪个函数,这种机制叫重载。重载不关心函数的返回值类型。但是...

C++ 封装、继承、多态、重载、覆盖、隐藏基本概念详解

一、面向对象的三个基本特征 (1)封装   也就是把客观事物封装为抽象的类,并且类可以把自己的数据和方法只让可信的对象或者类进行操作,不可信的类进行隐藏。 (2)继承  就是可以使用现有类的所有功能,...

learn C++ NO.1 覆盖、重载、隐藏、引用、作用域标示符、return

1、函数的覆盖 例子: class animal {        ……        virtual void breathe()        {               cou...

C++中谈重载、覆盖、和隐藏

在学习C++的时候,在了解到多态类(存在虚函数的类)的时候我知道了有关对象模型的概念,在剖析了有关对象模型的知识后,对于其中的派生类继承一个多态基类的时候,会对父类的虚函数进行重写,重写也就是所谓的覆...
  • ali94s
  • ali94s
  • 2016年06月04日 12:47
  • 141

C++重载、覆盖与隐藏

重载 前提:(1)同一作用域 (2)函数名相同 要求:不同形参表 注: 返回类型和参数的缺省值不参与重载识别。函数前缀的访问控制(public/protected/p...

c++中的隐藏、重载、覆盖(重写)

重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别...

C++ 类成员函数重载(overload), 覆盖、重写(overrider), 隐藏(hidden)

成员函数的重载、覆盖与隐藏 成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚 概念,否则错误将防不胜防。 8.2.1 重载与覆盖 成员函数被重载的特征: (...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:匪夷所思的C++重载、覆盖以及隐藏
举报原因:
原因补充:

(最多只允许输入30个字)