0

仮想継承に関する特定の問題に遭遇しました。以下のコードは構造を説明しています。

// 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*' に変換できません。仮想基底クラスからの変換が暗示されています」

これを可能にするには、継承をどのように正確に設定する必要がありますか?

4

0 に答える 0