2013-02-17 5 views
9

なぜなら、オーバーロードされた関数のいずれかが親で宣言されていると、C++が子どものおじさんのオーバーロードされた関数にアクセスすることを許可しない理由を理解する必要があります。子どものおじいちゃんのオーバーロードされた関数

class grandparent{ 
public: 
    void foo(); 
    void foo(int); 
    void test(); 
}; 

class parent : public grandparent{ 
public: 
    void foo(); 
}; 

class child : public parent{ 
public: 
    child(){ 
     //foo(1); //not accessible 
     test(); //accessible 
    } 
}; 

ここでは、foo()とfoo(int)の2つの関数がGrandparentの関数にオーバーロードされています。しかし、foo()はParentで宣言されているので、foo(int)にはアクセスできません(publicまたはprivateまたはprotectedであると宣言しても問題ありません)。しかし、test()はアクセス可能です。これはOOPの通りです。

この動作の理由を知る必要があります。

答えて

10

理由は、の方法が隠れているです。

派生クラスに同じ名前のメソッドを宣言すると、その名前の基本クラスメソッドは非表示になります。完全な署名は関係ありません(つまり、cv修飾子または引数リスト)。

明示的に呼び出しを許可したい場合は、parent

using grandparent::foo; 

を使用することができます。あなたは基本クラスとして、そのクラスを使用してコードで

struct Base { 
}; 

struct Derived : Base { 
    void f(int); 
}; 

、今あなたが書く:

+0

この動作が良い理由はありますか? (つまり、理由は何ですか?理由は何ですか?理由は何ですか?) –

+1

@SanjayManohar私が見る唯一の使用は、間違いを防ぐことです。つまり、あなたは親からメソッドを呼び出すと思っています。実際には、祖父母からメソッドを呼び出すことになります。そして 'using'ディレクティブでそれを回ることができます。 –

+0

@SanjayManohar参照http://stackoverflow.com/questions/4837399/c-rationale-behind-hiding-rule –

1

ただ、ライブラリは、このクラスを持っていることを想像し

Derived d; 
d.f('a'); 

そして、あなたはそのライブラリの光沢のある新しいバージョン2.0を手に入れました。基本クラスはちょっと変わっています:

struct Base { 
    void f(char); 
} 

ここで過負荷が適用された場合、コードが破損する可能性があります。

関連する問題