a.成员函数被重载overload的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖override(重写)是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
它们之间最为重要的区别就是:
覆盖的函数是多态的,是存在于vtbl之中的函数才能构成"覆盖"的关系,而隐藏的函数都是一般的函数,不支持多态,在编译阶段就已经确定下来了.
重载和重写的区别:
(1)范围区别:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
(2)参数区别:重写与被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
(3)virtual的区别:重写的基类必须要有virtual修饰,重载函数和被重载函数可以被virtual修饰,也可以没有。
隐藏和重写,重载的区别:
(1)与重载范围不同:隐藏函数和被隐藏函数在不同类中。
(2)参数的区别:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基类中的函数是否被virtual修饰,基类函数都是被隐藏,而不是被重写。
练习: 1 #include <stdlib.h> 2 #include <stdio.h>
3 #include <string> 4 #include <string.h> 5 #include <iostream> 6 #include <vector> 7 #include <stack> 8 using namespace std; 9 class Base 10 { 11 public: 12 virtual void f( float x) {cout << " Base::f(folat) " << x << endl;} 13 void g( float x) {cout << " Base::g(float) " << x << endl;} 14 }; 15 16 class Derived: public Base 17 { 18 public: 19 virtual void f( float x) {cout << " Derived::f(float) " << x << endl;} virtual void f(int x) {cout << " Derived::f(int) " << x << endl;} void g(float x) {cout << " Deriver::g(float) " << x << endl;} 20 void g( int x) {cout << " Deriver::g(int) " << x << endl;} 21 }; 22 23 int main() 24 { 25 Derived d; 26 Base *pb =&d; 27 Derived *pd =&d; 28 pb->f( 3.14f );//Derived::f(float) 3.14 覆盖override 29 pd->f( 3.15f ); //Derived::f(float) 3.15 Derived类成员函数重载overload 30 pb->g( 3.16f ); // 输出结果:Base::g(float)3.16 31 pd->g( 3.17f ); // 输出结果:Dervied::g(float)3.17 Derived 类的成员函数g重载
32 return 0 ; 33 }
Derived
来源:https://www.cnblogs.com/guxuanqing/p/5949953.html