匪夷所思的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)继承  就是可以使用现有类的所有功能,...

C++ 重载 覆盖 隐藏

成员函数的重载、覆盖与隐藏 成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚 概念,否则错误将防不胜防。 8.2.1 重载与覆盖 成员函数被重载的特征: (...

c++(重载、覆盖、隐藏) (3)

函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题 1、声明/定义重载函数时,是如何...

c++(重载、覆盖、隐藏) (1)

成员函数的重载、覆盖与隐藏 成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚 概念,否则错误将防不胜防。 8.2.1 重载与覆盖 成员函数被重载的特征: (...

C++中的覆盖、重载与隐藏

c++中类本身之间的函数关系与基类和子类之间的函数关系有:覆盖、重载与隐藏。 1>覆盖:C++中在基类用virtual定义的函数在子类中重新定义,此时称为覆盖,即子类对父类函数的覆盖。 2>重载:...

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

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

C++父子类继承时的隐藏、覆盖、重载

存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏、覆盖和重载这几种情况。对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考。希望对大家理解有帮助,也欢迎指正。 1.父子...

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

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

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

http://www.jb51.net/article/54225.htm 这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可...

C++重载、覆盖与隐藏

重载 前提:(1)同一作用域 (2)函数名相同 要求:不同形参表 注: 返回类型和参数的缺省值不参与重载识别。函数前缀的访问控制(public/protected/p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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