c++での継承とjavaでの継承の比較

6208 ワード

JAva:
class Parent{
    public void test(int a){
        System.out.println("Parent:" + a);
        System.out.println(this.getClass().getName());
    }
}

class Child extends Parent{
    public void test(int a, int b){
        System.out.println("Child:" + a + " " + b);
    }
}

public class ParentAndChild {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Child ch = new Child();
        ch.test(5);//     java              ,    ,  
                   //
    }

}
/*

     Parent:5     testone.Child
*/

c++中:
#include<iostream>
using namespace std;

class Parent{
    public:

     static void run(){
        cout<<"Parent"<<endl;
     }
void test(int a){ cout<<"Parent:"<<a<<endl; } void test(int a, int b){ cout<<"Parent:"<<a<<" "<<b<<endl; } }; class Child : public Parent{ public:

         /* static void run(){//この2つの書き方はいずれも正しいcout<「Child」<      void run(){        cout<<"Child"<      */
void test(int a, int b){
            cout<<"Child:"<<a<<" "<<b<<endl;
        }
};

int main(){
    Child ch;
    ch.Parent::test(5, 4);//                  
    //ch.test(4); //  :              ,          ,      
                  //    ch.Parent::test(4); 
    return 0;
} 

違い:c++では、リロードはベースクラスと派生クラスの間では発生しません.ベースクラスと派生クラスに同じ名前の関数が存在する場合、同じ名前の関数のパラメータの数やタイプが同じかどうかにかかわらず、派生クラスの同じ名前の関数は、リロード関係ではなくベースクラスの同じ名前の関数を非表示にします(下の説明で非表示になります).この場合、派生クラスオブジェクトから同名の関数を呼び出すと、派生クラスの関数にしかアクセスできません.ベースクラスの関数に無理にアクセスするには、関数名にクラス役割ドメインを付ける必要があります.上記のコードに示すように.Java中性子クラスでは、親クラスのメソッドが継承され、子クラスの同名メソッドと親クラスの同名メソッドは、リロード関係であるか、上書き関係であるか、エラー(同名同パラメータが異なる戻りタイプであるなど)になります.
c++で非表示にすると、ベースクラスと派生クラスの間にのみ表示され、同じクラスでは発生しません(そうしないと、コンパイラに二義性が発生します).ベースクラスと派生クラスに同名の関数が存在する場合、前述の例のように、同名の関数のパラメータの個数やタイプが同じかどうかにかかわらず、派生クラスの同名の関数は、リロード関係ではなく、ベースクラスの同名の関数(この関数は静的でも非静的でもよい)を非表示にします.この場合、派生クラスオブジェクトから同名の関数を呼び出すと、派生クラスの関数にしかアクセスできません.ベースクラスの関数に無理にアクセスするには、関数名にクラス役割ドメインを付ける必要があります.虚関数(virtualで修飾された)について、ベースクラスに虚関数がある場合、派生クラスに同じ名前の同パラメータの関数がある場合(関数は自動的に虚化されます)、その戻り値は必ずベースクラスの虚関数の戻り値と同じになります!非表示に失敗しました.
しかしjavaでは、非静的メソッドは非静的メソッドでしか上書きできないという原則を覚えておいてください.静的メソッドは、非静的メソッドでのみ上書きできます.抽象メソッドは特定のクラスで上書きする必要があります!ファイナルメソッド(バンドオフ)  キーワードfinalのメソッド)は上書きできません!