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
    }
};

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

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

4

2 に答える 2

10

理由はメソッドの隠蔽です。

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

明示的に呼び出しを許可したい場合は、次を使用できます

using grandparent::foo;

内部parent

于 2013-02-17T23:49:47.123 に答える
1

ライブラリに次のクラスがあると想像してみてください。

struct Base {
};

コードでは、そのクラスを基本クラスとして使用します。

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

そして今、あなたは書きます:

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

そして今、そのライブラリの光沢のある新しいバージョン 2.0 を取得し、基本クラスが少し変更されました。

struct Base {
    void f(char);
}

ここでオーバーロードが適用されると、コードが壊れます。

于 2013-02-18T15:14:21.117 に答える