0

クラス階層をシリアライズしていますが、両方にシリアライゼーション関数を実装するよう要求したいと考えています。

class Base
{
  virtual void serialize(File file)
  {
    file << _baseMember;
  }
  int _baseMember;
}

class Derived : public Base
{
  virtual void serialize(File file)
  {
    Base::serialize(file);
    file << _derivedMember;
  }
  int _derivedMember;
}

Derived::serialize()派生クラスにシリアル化関数を実装することを常に覚えていれば、すべて正常に機能しますが、このコードはそのままでは定義する必要はありません。

次に考えたのは、serialize実装を要求するインターフェースを作成することでした。

class Serializable
{
 virtual void serialize(File file) = 0;
}

class Base : public Serializable { ... }
class Derived : public Base : public Serializable { ... }

しかし、これでコンパイラの警告が作成されますwarning: direct base 'Serializable' inaccessible in 'Derived' due to ambiguity。これは、私のデザインの何かが間違っていると感じさせます。

同じ継承チェーンの一部である 2 つのクラスが仮想の特定の関数を実装することを要求する適切な方法は何でしょうか?

4

1 に答える 1

0

私の意見では、最初のバージョンは正しいデザインです。意味的に、Base がシリアライズ可能であるのに Derived がシリアライズ可能でないのはなぜですか? Derived が独自の実装を提供しない場合でも? それはまだシリアライズ可能です。

回避策は、次のようにすることです。

class Base {
    virtual void serialize() {
        file << _baseMember;
        subSerialize();
    }
    virtual void subSerialize() = 0;
};

class Derived : public Base {
    virtual void subSerialize() {
        file << _derivedMember;
    }
};
于 2013-06-06T18:45:32.020 に答える