您如何需要基类和派生类来实现虚函数?

时间:2013-06-06 18:44:03

标签: c++ inheritance interface multiple-inheritance

我正在序列化我的类层次结构,我想要求它们都实现序列化功能。

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;
}

如果我总是记得在派生类中实现serialize函数,那么一切正常,但是这样的代码不需要定义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。这让我觉得我设计中的某些东西是错误的。

要求作为同一继承链一部分的两个类实现虚拟的特定函数的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

在我看来,第一个版本是正确的设计。从语义上讲,为什么在Base出现时Derived不能序列化?即使Derived不提供自己的实现?它仍然是“is-a”Serializable。

解决方法可能是这样做的:

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

class Derived : public Base {
    virtual void subSerialize() {
        file << _derivedMember;
    }
};