仮想継承に関する特定の問題に遭遇しました。以下のコードは構造を説明しています。
// Header
struct ITarget
{
virtual void SetValue() = 0;
};
struct ISource
{
virtual void GetValue() const = 0;
};
struct IBase
{
virtual void Stuff() = 0;
};
struct IInput :
virtual public IBase, public ITarget
{
// Publicly acts only as Target
};
struct IOutput :
virtual public IBase, public ISource
{
// Publicly acts only as Source
};
// Implementation
struct SBase :
virtual public IBase, virtual public ISource, virtual public ITarget
{
// IBase
virtual void Stuff();
// ISource
virtual void GetValue() const;
// ITarget
virtual void SetValue( );
};
struct SInput :
public IInput, public SBase
{
// Defines ITarget and ISource per SBase
};
struct SOutput :
public IOutput, public SBase
{
// Defines ITarget and ISource per SBase
};
int main()
{
// To demonstrate the behavior
ISource* input = new SInput();
((SInput*)input)->GetValue();
return 0;
}
ここで、ISource * をSInput * にキャストしようとすると、エラー C2635 が発生します。
「'ISource*' を 'SInput*' に変換できません。仮想基底クラスからの変換が暗示されています」
これを可能にするには、継承をどのように正確に設定する必要がありますか?