ゴール:
保護されたポインターまたはプライベート ポインターをインスタンス化して解放するときに、メソッド (ゲッターとセッター) を単に非表示にする少数の子孫のみを除いて、同じ機能を持つ基本クラスを共有します。
問題:
セッターのみを再宣言すると、ゲッターを呼び出すときにこのエラーが発生します。
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;
}