2012-03-19 3 views
16

実装された(純粋なものとは対照的に)仮想関数をprivateまたはprotectedとして宣言する理由があることは理解できます。 Afaikでは、実装された仮想メソッドがprotectedとして宣言されている場合、子クラスは基本クラスのメソッドを呼び出すことができます。 privateを宣言すると、基本クラスだけが仮想メソッドのデフォルト実装を呼び出すことができます。プライベートと保護された純粋な仮想関数に違いはありますか?

しかし、純粋な仮想では、基本的な実装はありません...純粋な仮想を私的または保護されたものとして宣言することは機能的に同等ですか?保護された純粋な仮想は、基本クラスの対応するメソッドを呼び出すことができないため意味がありません。保護された純粋な仮想が意味をなさないシナリオはありますか?

SOには似たようなトピックがいくつかありますが、私の質問に簡潔に答えたものは見つかりませんでした。

+0

インターフェイスに 'friend'を実装することができます。 – Matthew

+6

純粋仮想メソッドはbodyを持つことができ、base :: foo()のように明示的に呼び出すことができます。 – iammilind

答えて

8

保護された純粋な仮想によって、 が意味するシナリオはありますか。

保護されているわけではありませんが、ここでは私的だと思いますが、私はあなたのことを理解していると思います。実際、純粋仮想のアクセスタイプは派生クラスでオーバーライドできます。

class Parent 
{ 
    protected: virtual void foo() = 0; 
    private: virtual void bar() = 0; 
    public:   void test() { foo(); bar(); } 
}; 

class Child : public Parent 
{ 
    public: void test2() { foo(); /* bar(); // cannot be called here */ } 
}; 

class GrandChild : public Child 
{ 
    // access types here can be anything for this example 
    public: void foo() { cout << "foo" << endl; } 
    public: void bar() { cout << "bar" << endl; } 
}; 
+0

ありがとうございます。 – Prismatic

+0

いいえ。この例では、GrandChildが 'foo()という名前で呼び出されていれば、そのクラスの子孫が呼び出すことはできません。 ) 'を呼び出すと、コンパイルして期待通りに動作し、' GrandChild :: foo'が呼び出されます。 – mfontanini

+2

はいPris、仮想関数は、アクセス可能性を開く可能性のある別のアクセスタイプで上書きできます。 – LiquidAsh

4

まず純粋仮想関数を実装することができます。ここでは、プライベートと仮想純粋な保護との違いを見るのを助けるかもしれない例です!

#include <iostream> 

class Animal 
{ 
public: 
    void eat(void); 
protected: 
    virtual void doEat(void)=0; 
}; 
void Animal::eat(void) 
{ 
    doEat(); 
} 
void Animal::doEat(void) 
{ 
    std::cout << "animal" << std::endl; 
} 

class Tiger : public Animal 
{ 
private: 
    virtual void doEat(void) 
    { 
    Animal::doEat();//here is the difference between protected and private 
    std::cout << "tiger" << std::endl; 
    } 
}; 

int main(void) 
{ 
    Animal *p = new Tiger(); 
    p->eat(); 
    return 0; 
} 

、ハーブサッターは、「仮想プライベート」または「保護された仮想」を使用するとき、あなたはこのarticle .Iから読み取ることができる第二を説明し、これは我々がこれを行う理由だけではなく、我々はできる説明だと思うの記事は言います:!」仮想関数をプライベートにすることをお勧めします。派生クラスが仮想関数の基本実装を呼び出す必要がある場合にのみ、仮想関数を保護するようにしてください。あなたの質問は純粋な仮想関数に関するものです。

関連する問題