3

コンパイラがこれを好まない理由がわかりません。問題の例を次に示します。

class A
{
public:
    virtual void Expand() { }
    virtual void Expand(bool flag) { }
};

class B : public A
{
public:
    virtual void Expand() {
        A::Expand(true);
        Expand(true);
    }
};

これをコンパイルしようとすると、コンパイルは正常に行われますA::Expand(true);が、スコープExpand(true);がない場合は次のコンパイラエラーが発生します。

'B :: Expand':関数は1つの引数を取りません

4

2 に答える 2

4

virtualその振る舞いのためのメソッドは必要ありません。派生クラスのメソッドは、基本クラスの同じ名前のメソッドを非表示にします。したがってExpand、派生クラスで名前が付けられた関数がある場合(基本クラスからの仮想メソッドのオーバーライドであっても)、署名に関係なく、同じ名前の基本クラスメソッドは表示されません。

を使用して、基本クラスのメソッドを表示できますusing。そのためには、次using A::Expand;の定義に追加しBます。

class B : public A
{
public:
    using A::Expand;  
    virtual void Expand() { Expand(true); }
};
于 2012-04-18T16:59:50.037 に答える
3

これは、ベースをオーバーライドするだけでなく、ベースExpand()も非表示Expand(bool)にしているためです。

基本クラスのメソッドと同じ名前の派生クラスにメンバー関数を導入すると、その名前のすべての基本クラスメソッドが派生クラスに非表示になります。

これは、(あなたが持っているように)修飾するか、usingディレクティブを使用して修正できます。

class B : public A
{
public:
    using A::Expand;
    virtual void Expand() {
        A::Expand(true);
        Expand(true);
    }
};
于 2012-04-18T16:58:47.250 に答える