今天看书遇到了C++中比较难缠的概念,就是重载、覆盖和隐藏。如果只要区分重载和覆盖,相信应该没有什么难度,并且它们的界限还是比较清晰的。现在加上了隐藏,初次看这些概念还真是不好区分。下面总结一下它们之间的区别:
成员函数的
重载的特征有以下4点:
(1) 必需在相同的范围内,即在同一个类的内部;
(2) 函数名称相同;
(3) 函数的参数不相同;
(4) virtual关键字可选,即可以加上也可以不加上,不影响重载的发生。
覆盖是指派生类函数覆盖基类函数,它的特征有以下4点:
(1)必需在不同的范围中,即分别在派生类和基类中;
(2) 函数名称相同;
(3) 参数也必需相同;
(4) 基类函数必需有virtual关键字。
而隐藏行为则必需符合以下两条规则:
(1) 如果派生类的函数与基类的函数的名称相同,但是参数不同。此时,不管有无virtual关键字,基类的函数都会被派生类的同名函数隐藏;
(2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。这个时候基类的同名函数也会被隐藏。
下面Demo说明了覆盖和隐藏之间的区别
覆盖例子:
#include <iostream>
#include <cstdlib>
using namespace std;
class a
{
public :
void virtual hello()
{
cout<<"a hello()"<<endl;
}
void hello(int i)
{
cout<<"a.hello(i)"<<i<<endl;
}
};
class b: public a
{
public:
void hello()
{
cout<<"b hello()"<<endl;
}
void hello(int i) const
{
cout<<"b.hello(i)"<<i<<endl;
}
};
int main(int argc,char * args[])
{
{
a *aptr=new b;
aptr->hello();
b* bptr=new b;
bptr->hello();
delete aptr;
delete bptr;
}
system("pause");
return EXIT_SUCCESS;
}
上面的例子是覆盖,由于基类a中和派生类b中的hello函数的签名完全相同,而且基类a中有virtual关键字,所以基类a中的hello函数被派生类b中的hello函数所覆盖,因此具有多态的特性(只有覆盖才具有多态的特征)。
这段代码显示的结果为:
稍微改动上述代码,得到下面的例子:
#include <iostream>
#include <cstdlib>
using namespace std;
class a
{
public :
void hello()
{
cout<<"a hello()"<<endl;
}
void hello(int i)
{
cout<<"a.hello(i)"<<i<<endl;
}
};
class b: public a
{
public:
void hello() const
{
cout<<"b hello()"<<endl;
}
void hello(int i) const
{
cout<<"b.hello(i)"<<i<<endl;
}
};
int main(int argc,char * args[])
{
{
a *aptr=new b;
aptr->hello();
b* bptr=new b;
bptr->hello();
delete aptr;
delete bptr;
}
system("pause");
return EXIT_SUCCESS;
}
改动后代码运行的结果是:
- 大小: 16.3 KB
- 大小: 17.4 KB
分享到:
相关推荐
C++的重载、隐藏、覆盖规则 C++的重载、隐藏、覆盖规则 C++的重载、隐藏、覆盖规则
这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下
一个技术文档,记录一些关于C++方面的函数的重载和覆盖方法,可供参考
文件详细描述了C++成员函数的重载、覆盖与隐藏技术,对于初学C++的人员很有帮准,也是我们程序猿参考、学习的重要资料。
主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下
C++ 函数重载 运算符重载 类型转化 符合课本 自己写的 绝对运行 有用
前几天面试时被问及C++中的覆盖、隐藏,概念基本答不上来,只答了怎么用指针实现多态,也还有遗漏。最终不欢而散。回来后在网上查找学习了一番,做了这个总结。其中部分文字借用了别人的博客,望不要见怪。 •概念 ...
对于C++重载的使用方法学习的好例子 1、符号重载的方法使用。
C++函数重载的例子解析,C++函数模板重载
一个c++运算符重载例子.属于原创,代码比较清晰
详细介绍了C++中运算符的重载,使读者深入理解C++中运算符的重载的方法
C++重载加法,在书中摘取的代码资源,可用。本资源仅用于学习。
C++中绝大部分的运算符允许重载,具体规定见表 不能重载的运算符只有5个: . (成员访问运算符) .* (成员指针访问运算符) :: (域运算符) sizeof (长度运算符) ?: (条件运算符) 前两个运算符不能重载是为了保证...
c++ operator重载说明操作文档。
C++函数重载例子,详细的代码讲解,短小精悍,可以供自学使用,仅供参考
要弄清楚重载、覆盖、多态与函数隐藏之间的复杂且微妙关系。这是C++基本功,几个概念容易混淆,易于掌握,要多运用。
详细介绍 C++运算符重载 的PPT 文中部分内容: ...重载下标运算符“[]”的一个优点是可以增加C++中数组检索的安全性 重载下标运算符“[]”时,返回一个int的引用,所以可使重载“[]”用在赋值语句的左边。
C++全套学习课件函数的覆盖、隐藏和重载.pdf
C++运算符重载:赋予运算符另一种作用,实现自定义类型的运算C++运算符重载内容: 1.友元重载 2.类重载 3.输入输出流重载
踏入C++的世界已经两年了,但一直在黑夜中前行,最近看到了由Lostmouse 译的Scott Meyers的著作《EffectiveC++》的中文版电子书,犹如一盏指路明灯,照亮了我前进的路。这本书由lians制作,由save 修订。在这里对...