C++ (重载、覆盖、隐藏)
2016-06-21 23:38
225 查看
成员函数的重载、覆盖(override)与隐藏很容易混淆,今天好好整理下。
重载
《高质量C++/C编程指南》已经清晰的列出了重载函数的特性:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
解析: 函数参数不同,可以认为是重载函数是不同的函数,编译器能够明确的根据不同的参数来调用不同的函数。
那么对于重载函数,编译器怎么识别的呢?
举例:
对于样两个函数,就构成重载了。
这里注意:重载与返回值无关
覆盖(也成重写)
覆盖,是指 派生类函数覆盖基类函数,只作用于派生类,特性如下:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual关键字。
这里会用到虚函数,实际上虚函数的作用,就是实现覆盖。
隐藏
隐藏,是指派生累函数将基类函数给藏起来了,当然只作用于派生类函数,其特性与覆
盖不同。
注意:(1)如果派生类的函数与基类的函数名相同,但是参数不同。此时,不论有无virtual关键字。此时,基类函数会被隐藏。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关
键字。此时,基类的函数被隐藏。
对于覆盖和隐藏的例子:
再来一个例子: // 2016/9/20
重载
《高质量C++/C编程指南》已经清晰的列出了重载函数的特性:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual关键字可有可无。
解析: 函数参数不同,可以认为是重载函数是不同的函数,编译器能够明确的根据不同的参数来调用不同的函数。
那么对于重载函数,编译器怎么识别的呢?
举例:
class A { public: void display(int a, int b ) { printf("This is first /n"); } void display(int a) { printf("This is second/n"); } }; int main() { A a; a.display(5); return 0; }
对于样两个函数,就构成重载了。
这里注意:重载与返回值无关
class A { public: void display(int a ) { printf("This is first /n"); } void* display(int a) { printf("This is second/n"); } }; int main() { A a; a.display(5); return 0; }所以,仅仅靠返回值,是不能成为重载判定条件的。
覆盖(也成重写)
覆盖,是指 派生类函数覆盖基类函数,只作用于派生类,特性如下:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual关键字。
这里会用到虚函数,实际上虚函数的作用,就是实现覆盖。
隐藏
隐藏,是指派生累函数将基类函数给藏起来了,当然只作用于派生类函数,其特性与覆
盖不同。
注意:(1)如果派生类的函数与基类的函数名相同,但是参数不同。此时,不论有无virtual关键字。此时,基类函数会被隐藏。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关
键字。此时,基类的函数被隐藏。
对于覆盖和隐藏的例子:
class Base { public: void f(int x) { cout << "Base::f(int) " << x << endl; } void f(float x) { cout << "Base::f(float) " << x << endl;<span style="font-family: Arial;">//重载</span> } virtual void g(void) //虚函数 { cout << "Base::g(void)" << endl; } }; class Derived : public Base { public: virtual void g(void) //覆盖 { cout << "Derived::g(void)" << endl; } }; void main(void) { Derived d; Base *pb = &d; pb->f(10); // Base::f(int) 10 pb->f(3.14f); // Base::f(float) 3.14 pb->g(); // Derived::g(void) }
再来一个例子: // 2016/9/20
相关文章推荐
- C语言中,有符号数,无符号数,整数溢出
- Product of Array Except Self
- 数字阶梯求和
- C++对象所占内存的大小
- c语言学习笔记33之void
- Calculation
- Search a 2D Matrix II
- [转载]C语言字节对齐(以32位系统为例)
- 你最需要注意的11条要点for C++
- C++常类型(const)
- C语言中的typedef问题
- C++ 中的单例模式
- C语言链式栈和顺序栈的实现
- C语言数组,顺序表的初始化,添加,删除和打印
- C语言单链表的3种排序算法,插入排序,冒泡排序,选择排序
- 课程表(c语言)
- 今天研究了一下手机通信录管理系统(C语言)
- C语言双向循环链表的生成,删除和打印
- C语言实现约瑟夫环,使用循环单链表和循环数组2种方法
- AVL平衡树及插入操作的C语言实现