关于C++的重载等问题
来源:互联网 发布:linux 安装命令 编辑:程序博客网 时间:2024/05/16 01:51
呵呵,基础不牢靠呀。总是搞不清楚C++的重载,因此总是用错,网上搜索原来是经常和重写、重定义搞混淆(实际上Eclipse编辑器中有相应的Tips,只是以前没有注意过)。转载一篇不错的总结性的博文。原文链接地址:http://www.wutianqi.com/?p=3171。没有经过任何修改和代码验证,只是通过阅读此篇博文解决了自己的问题,因此直接转载过来,如下。
C++的一些特性好久没使用了,导致有些生疏了,所以查了一些资料,回顾了一下。
先来看几个概念:
重载(overload),重写(override,也称覆盖), 重定义(redefine,也称隐藏)
(PS:第三个我不确定在英文中是否应该称为redefine,如有问题,留言告知,谢谢)
一、重载(overload)
指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
(5)返回值可以不同;
二、重写(也称为覆盖 override)
是指派生类重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…
(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的
三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。
OK,这里给出一个样例代码,是论坛那个问题的代码做了一些修改,方便理解:
1
#include <iostream>
2
#include <complex>
3
using
namespace
std;
4
5
class
Base
6
{
7
public
:
8
virtual
void
a(
int
x) { cout <<
"Base::a(int)"
<< endl; }
9
// overload the Base::a(int) function
10
virtual
void
a(
double
x) { cout <<
"Base::a(double)"
<< endl; }
11
virtual
void
b(
int
x) { cout <<
"Base::b(int)"
<< endl; }
12
void
c(
int
x) { cout <<
"Base::c(int)"
<< endl; }
13
};
14
15
class
Derived :
public
Base
16
{
17
public
:
18
// redefine the Base::a() function
19
void
a(complex<
double
> x) { cout <<
"Derived::a(complex)"
<< endl; }
20
// override the Base::b(int) function
21
void
b(
int
x) { cout <<
"Derived::b(int)"
<< endl; }
22
// redefine the Base::c() function
23
void
c(
int
x) { cout <<
"Derived::c(int)"
<< endl; }
24
};
25
26
int
main()
27
{
28
Base b;
29
Derived d;
30
Base* pb =
new
Derived;
31
// ----------------------------------- //
32
b.a(1.0);
// Base::a(double)
33
d.a(1.0);
// Derived::a(complex)
34
pb->a(1.0);
// Base::a(double), This is redefine the Base::a() function
35
// pb->a(complex<double>(1.0, 2.0)); // clear the annotation and have a try
36
// ----------------------------------- //
37
b.b(10);
// Base::b(int)
38
d.b(10);
// Derived::b(int)
39
pb->b(10);
// Derived::b(int), This is the virtual function
40
// ----------------------------------- //
41
delete
pb;
42
43
return
0;
44
}
通过这里可以看出:
1.Base类中的第二个函数a是对第一个的重载
2.Derived类中的函数b是对Base类中函数b的重写,即使用了虚函数特性。
3.Derived类中的函数a是对Base泪中函数a的隐藏,即重定义了。
4.pb指针是一个指向Base类型的指针,但是它实际指向了一个Derived的空间,这里对pd调用函数的处理(多态性)取决于是否重写(虚函数特性)了函数,若没有,则依然调用基类。
5.只有在通过基类指针或基类引用 间接指向派生类类型时多态性才会起作用。
6.因为Base类的函数c没有定义为virtual虚函数,所以Derived类的函数c是对Base::c()的重定义。
网上参考资料:
1.http://sns.linuxpk.com/blog-6583-17085.html
2.http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html
3.http://blog.sina.com.cn/s/blog_6ae7d6b00100pb4v.html
4.http://topic.csdn.net/u/20110227/23/42d93b05-03b1-460b-8521-707117ce5600.html
5.http://www.cnblogs.com/realyan/archive/2011/07/14/2106339.html
6.http://topic.csdn.net/u/20081023/18/122ac3bd-8ad2-4e6e-8624-090f22c82139.html
- 关于C++的重载等问题
- 关于重载的问题
- 关于sony等机型拍照后返回重载了Activity的问题
- Objective-C 重载的问题
- 关于C语言等程序中指针相关的问题
- 关于js的函数重载的问题
- C++里关于重载函数的问题
- 关于powerbuilder的全局函数重载问题
- 关于矩阵乘法重载的问题
- 关于javascript重载问题的解决
- Java 关于重载的那点问题
- 关于c++提取符号“>>”的重载问题
- 关于重载与重写的规则问题
- 关于运算符重载的问题
- 关于重载问题
- C++operator重载问题
- C语言中关于指针,二维数组等的问题,一个有趣的发现
- 关于C语言等高级语言能不能直接控制硬件的问题
- UILable的常用用法
- 数据库关系代数表达式学习
- linux进程控制初步认识
- easyui datagrid combobox 选择后显示valueField 而不是 textValue解决方法
- C++程序设计学习第一季
- 关于C++的重载等问题
- WordPress代码实现相关文章的几种方法(一)
- huffman 文件 压缩 解压缩
- Winform程序中打开网页,并登陆
- 思维导图笔记——软件工程
- UserTransaction
- 不谈技术,成为IT经理必备的十大软技能
- UVa 10252 Common Permutation (water ver.)
- VC6开关工程太麻烦!