C++のリロード、上書き、非表示
11780 ワード
C++の虚関数はオブジェクト向けプログラミングの多態性という特徴を体現しているが,派生クラス継承の過程で,上書きはベースクラスのいくつかの関数を呼び出すことができないことが多いため,ここではリロード(overload),上書き(override),隠蔽(hide)について簡単な議論とまとめを行う.
1、リロード:同一のアクセス可能領域内で声名を持ついくつかの異なるパラメータ列を持つ(パラメータの種類、個数、順序が異なる)同じ名前の関数で、プログラムは異なるパラメータ列によって具体的にどの関数を呼び出すかを確定する.このメカニズムはリロードと呼ばれ、リロードは関数の戻り値タイプに関心がない.
前例はoverload関数のリロード関数であり、
重荷の特徴は主に
カバーの主な特徴は
1、リロード:同一のアクセス可能領域内で声名を持ついくつかの異なるパラメータ列を持つ(パラメータの種類、個数、順序が異なる)同じ名前の関数で、プログラムは異なるパラメータ列によって具体的にどの関数を呼び出すかを確定する.このメカニズムはリロードと呼ばれ、リロードは関数の戻り値タイプに関心がない.
1 void overload();
2 void overload(int);
3 void overload(int, int);
4 void overload(double,int);
5 void overload(double);
前例はoverload関数のリロード関数であり、
重荷の特徴は主に
1) ( );
2) ;
3) ;
4) virtual 。
2、 , 、 、 , ( ) , , , 。( )。
1 class Base
2 {
3 public:
4 virtual void override();
5 virtual void override(int);
6
7 };
8 class Device :public Base
9 {
10 public:
11 void override();
12 };
1 Device d;
2 int a = 0;
3 d.override(); //OK
4 d.override(a); // , ,
カバーの主な特徴は
1) ( );
2) ;
3) ;
4) virtual 。
3、
,
1) , 。 , virtual , ( )。
2) , , virtual 。 , ( )。
1 #include <iostream.h> 2 3 class Base 4 5 { 6 7 public: 8 9 virtual void f(float x){ cout << "Base::f(float) " << x << endl; } 10 11 void g(float x){ cout << "Base::g(float) " << x << endl; } 12 13 void h(float x){ cout << "Base::h(float) " << x << endl; } 14 15 }; 16 17 class Derived : public Base 18 19 { 20 21 public: 22 23 virtual void f(float x){ cout << "Derived::f(float) " << x << endl; } 24 25 void g(int x){ cout << "Derived::g(int) " << x << endl; } 26 27 void h(float x){ cout << "Derived::h(float) " << x << endl; } 28 29 };
1 void main(void) 2 3 { 4 5 Derived d; 6 7 Base *pb = &d; 8 9 Derived *pd = &d; 10 11 // Good : behavior depends solely on type of the object 12 13 pb->f(3.14f); // : Derived::f(float) 3.14 14 15 pd->f(3.14f); // : Derived::f(float) 3.14 16 17 // Bad : behavior depends on type of the pointer 18 19 pb->g(3.14f); // : Base::g(float) 3.14 20 21 pd->g(3.14f); // : Derived::g(int) 3 22 23 // Bad : behavior depends on type of the pointer 24 25 pb->h(3.14f); // : Base::h(float) 3.14 26 27 pd->h(3.14f); // : Derived::h(float) 3.14 28 29 }
:f() , g() h() 。 , , f() , f(), f(), “ ” 。 , f() , , , f(), , “ ” f(), f(), “ ” 。