c++のオーバーライド、オーバーロード、非表示


定義#テイギ#
オーバーライド(override)
オーバーライド(override)とは、サブクラスが親クラスの虚関数を再定義することを意味します.特徴:
  • は、それぞれ継承関係を持つサブクラスと親クラスに位置する.
  • 親クラスの関数にはvirtualキーワードがあります.
  • サブクラスには、その関数名と同じ、パラメータリストと同じ、戻り値と同じ関数があります.

  • リロード(overload)
    リロード(overload)とは、同じ範囲内、同じクラス内、または同じ役割範囲内で、2つの関数は同じ関数名を有するが、異なるパラメータリストを指す.特徴:
  • 同じ作用範囲内の関数(例えば、同じクラス).
  • 関数名は同じで、パラメータリストは異なります(これにより、コンパイラは異なる関数とみなされます).

  • 非表示
    非表示とは、子クラスの関数が親クラスの関数を非表示にする場合です.
  • サブクラスの関数は親クラスの関数と完全に同じ(関数名が同じ、パラメータリストが同じ、戻り値が同じ)が、サブクラスの関数にはvirtualキーワードはありません.
  • サブクラスの関数は、親クラスの関数と関数名のみが同じです.この場合の非表示は、サブクラスにvirtualキーワードがあるかどうかとは関係ありません.

  • #include<iostream>
    using namespace std;
    class Base{
    public:
        void funcA(int n){
            cout << "In base class, funcA:" << n << endl;
        }
        virtual    void funcB(int n){
            cout << "In base class, funcA:" << n << endl;
        }
        void funcC(int n){
            cout << "In base class, funcC:" << n << endl;
        }
    };
    class Derived: public Base{
    public:
        void funcC(int n){
            cout << "In derived class, funcC:" << n << endl;
        }
        void funcA(int n1, int n2){
            cout << "In derived class, funcA:" << n1 << ','<< n2 << endl;
        }
        void funcA(int n1, int n2, int n3){
            cout << "In derived class, funcA:" << n1 << ','<< n2 << ',' << n3 << endl;
        }
        void  funcB(int n){
            cout << "In derived class, funcB:" << n << endl;
        }
    };
    int main(){
        Derived d;
        d.funcC(1);
        d.funcA(1, 2);
        d.funcA(1, 2, 3);
        d.funcB(10);
    }

    上書き:derived::funcA(int,int)とderived::funcA(int,int,int)
    リロード:virtual base::funcB(int)とderived::funcB(int)
    非表示:base::funcC(int)とderived::funcC(int)base::funcA(int)とderived::funcA(int,int)