C++中的重载、覆盖(重写)和隐藏
2017-03-20 18:56
183 查看
类中成员函数被重载的特征:
1、相同的作用域(同一个类中);
2、函数名字相同;
3、参数不同;
4、virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是:
1、不同的作用域(基类和派生类);
2、函数名字相同;
3、参数相同;
4、基类函数必须有virtual关键字。
隐藏指派生类函数屏蔽了与其同名的基类函数,特征是:
1、如果派生类的函数与基类的函数同名,但是参数不同,不论有无virtual关键字,基类的函数将被隐藏。(注意不能与重载混淆)
2、如果派生类的函数与基类的函数同名,参数也相同,基类函数没有virtual关键字,基类的函数将被隐藏。(注意不能与覆盖混淆)
函数Derived::test(float)覆盖了Base::test(float),运行结果如下:
函数Derived::test1(float)隐藏了Base::test1(float),运行结果如下:
函数Derived::test2(int)隐藏了Base::test2(float),运行结果如下:
函数Base::test2(int)重载了Base::test2(float),运行结果如下:
1、相同的作用域(同一个类中);
2、函数名字相同;
3、参数不同;
4、virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是:
1、不同的作用域(基类和派生类);
2、函数名字相同;
3、参数相同;
4、基类函数必须有virtual关键字。
隐藏指派生类函数屏蔽了与其同名的基类函数,特征是:
1、如果派生类的函数与基类的函数同名,但是参数不同,不论有无virtual关键字,基类的函数将被隐藏。(注意不能与重载混淆)
2、如果派生类的函数与基类的函数同名,参数也相同,基类函数没有virtual关键字,基类的函数将被隐藏。(注意不能与覆盖混淆)
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; class Base { public: virtual void test(float x) { cout << "Base::test(float) " << x << endl; } void test1(float x) { cout << "Base::test1(float) " << x << endl; } void test2(float x) { cout << "Base::test2(float) " << x << endl; } // 函数Base::test2(int)重载了Base::test2(float),函数名相同,参数不同,在同一个类中(同一作用域),故为重载 void test2(int x) { cout << "Base::test2(int)" << x << endl; } }; class Derived :public Base { public: // 函数Derived::test(float)覆盖了Base::test(float),函数名相同,参数相同,且有virtual关键字,故为覆盖 virtual void test(float x) { cout << "Derived::test(float) " << x << endl; } //函数Derived::test1(float)隐藏了Base::test1(float),函数名相同,参数相同,但没有virtual关键字,故为隐藏,而不是覆盖 void test1(float x) { cout << "Derived::test(float) " << x << endl; } //函数Derived::test2(int)隐藏了Base::test2(float),函数名相同,参数不同,但没有在同一个类中(同一作用域),故为隐藏,而不是重载 void test2(int x) { cout << "Derived::test(int) " << x << endl; } }; void Funtest() { Derived d; Base *pb = &d; Derived *pd = &d; /*pb->test(1.02f); pd->test(1.02f);*/ /*pb->test1(1.02f); pd->test1(1.02f);*/ /*pb->test2(1.02f); pd->test2(3);*/ pb->test2(1.02f); pb->test2(3); } int main() { Funtest(); system("pause"); return 0; }
函数Derived::test(float)覆盖了Base::test(float),运行结果如下:
函数Derived::test1(float)隐藏了Base::test1(float),运行结果如下:
函数Derived::test2(int)隐藏了Base::test2(float),运行结果如下:
函数Base::test2(int)重载了Base::test2(float),运行结果如下:
相关文章推荐
- C++成员函数重载、覆盖(重写)和隐藏
- C++中重载、重写(也称覆盖)、隐藏
- c++中的隐藏、重载、覆盖(重写)
- C++ 继承真正在做的事系列【重载,重写/覆盖,隐藏】
- 实例分析C++中重载、重写(覆盖)和隐藏的区别
- C++中重载、重写(也称覆盖)、隐藏
- c++中的隐藏、重载、覆盖(重写)
- C++ 重载,重定义(覆盖),重写名字隐藏
- C++中重载、重写(覆盖)和隐藏的区别实例分析
- 01-C++中重载、重写(也称覆盖)、隐藏
- C++中的隐藏、重载、覆盖(重写)
- C++中重载、重写(覆盖)和隐藏的区别实例分析
- C++重载(overload)、重写(overwrite,也称隐藏)、覆盖(override)
- C++ 类成员函数重载(overload), 覆盖、重写(overrider), 隐藏(hidden)
- c++中的隐藏、重载、覆盖(重写)
- C++中重定义、重写、重载的区别以及隐藏与覆盖的访问
- C++_重载、重写(覆盖)和隐藏的区别:
- 关于C++中的重载、重写(覆盖)、隐藏
- C++中重定义、重写、重载的区别以及隐藏与覆盖的访问
- c++中的隐藏、重载、覆盖(重写)