【问题标题】:How do you require a base and a derived class to implement a virtual function?您如何需要基类和派生类来实现虚函数?
【发布时间】:2013-06-02 21:57:51
【问题描述】:

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

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 aready 实现(纯)虚函数时,再次从 Serializable 继承 Derived 是没有意义的。因此,编译器会抱怨歧义。_如果模板类将当前类 Base,Derived,... 作为模板参数并且还具有纯虚方法,该怎么办。当您实现该类时,您必须实现该方法。但我担心这些是不相关的覆盖方法。至少你必须实现这样的功能。 _ 我担心没有可以使用的 C++ 语言功能。

标签: c++ inheritance interface multiple-inheritance


【解决方案1】:

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

解决方法可能是这样:

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

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

【讨论】:

  • 那么当我有一个class SubDerived : public Derived 类时会发生什么,我们如何确保它也被序列化?
  • 是抽象方法的“链”,我认为不可能只使用继承来做 OP 想做的事情,每个子类都必须调用 serialize 基方法,如果子类再次子类化,是同样的行为......
猜你喜欢
  • 2017-01-20
  • 2017-07-09
  • 2012-02-14
  • 2015-10-24
  • 2013-08-25
  • 1970-01-01
  • 2019-07-16
  • 2019-04-14
  • 2021-05-24
相关资源
最近更新 更多