3

ゴール:

保護されたポインターまたはプライベート ポインターをインスタンス化して解放するときに、メソッド (ゲッターとセッター) を単に非表示にする少数の子孫のみを除いて、同じ機能を持つ基本クラスを共有します。


問題:

セッターのみを再宣言すると、ゲッターを呼び出すときにこのエラーが発生します。

1>c:\projectengine\problem\main.cpp(8): error C2660: 'cDerived::SomeClass'
    : function does not take 0 arguments

ゲッターは実際には必要ありませんが、既に存在する場合、機能を開示する必要はありません。


結論:

cBase::SomeClass()はそのままcDerivedです。

次の行をコメントアウトすると、コンパイルエラーは発生しません(もちろん):

virtual void        SomeClass( cSomeClass* value ) override {}; // setter, C2660

ただし、それは機能するため、何も変更しないと、メモリ リークのリスクが生じます。一方、この偶発的な派生物は、cBaseそれ自体の子孫である残りの機能を継承する必要があります。

書き換えるcBase必要がありますか、またはセッターのみを非表示にすることは可能cDerivedですか?


エラーのあるコード:

main.cpp

class cSomeClass 
{ 
}; 

class cBase : public cAbsoluteBase
{ 
public: 
    cBase() : m_pSomeClass( 0 ){} 
    virtual cSomeClass* SomeClass(){ return m_pSomeClass; } 
    virtual void        SomeClass( cSomeClass* value ){ m_pSomeClass = value; }; 
protected: 
    cSomeClass* m_pSomeClass; 
}; 

class cDerived : public cBase 
{ 
private: 
    //          hide these 
    //virtual cSomeClass* SomeClass() override { return m_pSomeClass; }; 
    virtual void        SomeClass( cSomeClass* value ) override {};
}; 

cDerived derived; 

int main()
{

    cSomeClass* someClass = derived.SomeClass(); // C2660 

    return 0; 

} 
4

2 に答える 2

2

using宣言が必要です。それ以外の場合、派生クラスのオーバーロードは基本クラスの関数を非表示にします。(通常、これはエラーであるためです。1つのオーバーロードを特殊化する必要がある場合、通常はすべてを特殊化する必要があります。)

于 2012-08-06T08:15:08.360 に答える
0

あなたの説明に正確に従うことができるかどうかはわかりませんが、コード スニペットから、クラスからパブリックに継承したいように見えますが、基本クラス インターフェイスのメソッドの 1 つを削除します。

それは可能であり、偶然に行うことさえ可能ですが、それは非常に悪い考えです™. 公開継承は「is-a」関係です。Bclassからパブリックに継承するクラスがある場合A、その関係を宣言することの意味は、「 type のオブジェクトは type のオブジェクトBよりも大きくなる可能性がありますがA、それとは別に、BanAが期待される場所ならどこでも a を使用できます」ということです。明らかにBs には追加の動作がある可能性がありますが、パブリック継承により、それらが完全に機能するAs として機能することが保証されます。(ちなみに、これは「リスコフの置換原理」として知られています。)

Squareこれが、継承の初期の教科書の例の 1 つが完全に壊れていた理由でもあることに注意してくださいRectangle。はい、正方形は長方形ですが、それはSquareから公に継承することが健全な OO 設計であるという意味ではありませんRectangle。親クラスに対して追加の制限を持つサブクラスは、確立されたインターフェイス コントラクトに準拠しないことにより、他の点では完全に有効で有用な多くのコードを壊してしまうためです。(正方形の場合、それらは、長方形の辺を互いに独立して変更できるはずであるという契約条項を破ります。あなたの場合、インターフェースの一部を完全に削除しているようです。)

于 2012-08-07T13:43:25.200 に答える