私の意図はCBaseClass
、とりわけ type の一部のメンバーへのコンテナーとして機能する基本クラスを持つことCBaseMember
です。CDerivedClass : public CBaseClass
次に、を保持する a を導出しますCDerivedMember : public CBaseMember
。
へのポインターを使用してオブジェクトでCBaseMember
初期化することはできません。これは、多重継承の状況であり、実装とは無関係であるが に表示する必要がある追加のインターフェイス (純粋な抽象基本クラス) があるためです。たくさんのダーティ キャスティングは避けたいものです。CDerivedMember
CDerivedClass
CDerivedMember
CBaseClass
CDerivedClass
この問題に対する私の解決策はCBaseClass
、次のようなテンプレートを作成することでした。
//declaration
template <class Member>
CBaseClass
{
protected:
virtual void GenericMethod();
virtual void VirtualMethod() = 0;
Member* member;
};
//definition
template <class Member>
void CBaseClass<Member>::GenericMethod()
{
member->SomeMemberMethod();
}
そして、次CDerivedClass
のように継承します。
//declaration
CDerivedClass : public CBaseClass<CDerivedMember>
{
protected:
virtual void VirtualMethod();
};
//definition
void CDerivedClass::VirtualMethod()
{
member->SomeDerivedMethod();
}
予想通り、これは機能しません (CBaseClass<CDerivedMember>::GenericMethod()
明らかな理由で未解決です) が、残念ながら、意図したとおりにコードを変更する方法がわかりません。
それらがどのように適切に行われるかを説明してください。または、私の問題に対する別の解決策を提案してください。
ありがとう!