1

次の問題について教えていただければ幸いです。インターフェイスの柔軟なシステムを作成しようとしていますが、問題が発生しました。これは関連するコードです:

// Interface 1
//      this: virtual f_a
// -> abstract
struct I_A abstract
{
    virtual void f_a() = 0;
};

// Interface 2
//      I_A : virtual f_a
//      this: virtual f_b
// -> abstract
struct I_B abstract : public I_A
{
    virtual void f_b() = 0;
};

// Implementation 1
//      I_A : virtual f_a
//      zhis: defines f_a
// -> not abstract
struct S_A : public I_A
{
    virtual void f_a() {}
};

// Implementation 2
//      I_B : virtual f_a
//      I_B : virtual f_b
//      S_A : defines f_a
//      this: defines f_b
// -> not abstract
struct S_B : public I_B, public S_A
{
    virtual void f_b() {}
};

S_B は抽象的であるとコンパイラが宣言しているため、インスタンス化できません。なにが問題ですか?

4

1 に答える 1

1

ここで仮想継承を使用する必要があります。

struct I_A
{
    virtual void f_a() = 0;
};

struct I_B : virtual public I_A
{
    virtual void f_b() = 0;
};


struct S_A : virtual public I_A
{
    virtual void f_a() {}
};

注 1:abstract標準の C++ ではないため、クラス宣言のステートメントは無視しています。

注 2: これの複製がここにあります。ここでは、これが発生する理由についての説明を見つけることができます。

于 2012-08-12T10:49:34.857 に答える