如何要求基类和派生类来实现虚函数

How do you require a base and a derived class to implement a virtual function?

本文关键字:实现 函数 派生 基类      更新时间:2023-10-16

我正在序列化我的类层次结构,并且我想要求它们都实现一个序列化函数。

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。这让我觉得我的设计出了问题。

要求属于同一继承链的两个类实现特定的虚函数的正确方法是什么?

在我看来,第一个版本是正确的设计。从语义上讲,当Base是序列化的时候,为什么派生的不能序列化?即使派生不提供自己的实现?它仍然是可串行化的

一个解决方法可能是这样做:

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