【问题标题】:C++ enforcing implementing a pure virtual method from a different inheritance hierarchyC++ 强制从不同的继承层次实现纯虚方法
【发布时间】:2023-03-06 21:06:01
【问题描述】:

我有一个Parent 课程和两个Child 课程:

class Parent
{
};

class Child1: public Parent
{
};

class Child2 : public Parent
{
};

我想要第二个类层次结构,类 Cousin 位于层次结构的顶部,子类称为 Cousin1Cousin2 等:

class Cousin
{
    virtual void doUsefulWork() = 0;
};

class Cousin1 : public Cousin
{
    virtual void doUsefulWork() override
    {
        // One behaviour
    }
};

class Cousin2 : public Cousin
{
    virtual void doUsefulWork() override
    {
        // A different behaviour
    }
};

每个Child 子类必须继承Cousin 子类,才能实现doUsefulWork()

class Child1 : public Parent, Cousin1
{
    // Has implementation of doUsefulWork() from Cousin1
};

如何防止Child 子类的作者忘记继承Cousin 子类?我想要一些会产生编译时错误的东西。

每个Child 子类都必须有权访问doUsefulWork() 的实现。

我正在考虑让Cousin从Parent继承并在Parent中定义纯虚拟doUsefulWork(),但是我会在Child子类中遇到复杂的多重继承问题?

【问题讨论】:

  • 我会反过来做,从Cousin继承Parent。如果Child 类的作者忘记重新实现doUsefulWork() 或从具有实现的类继承,这至少会产生编译错误。
  • 反之亦然,class Parent : public Cousin { ... 可以解决问题。
  • 我希望这些名称仅用于此处的示例。恕我直言,“子父”类比是最糟糕的类比之一,因为 struct Child : Parent 实际上意味着每个 Child is-a Parent,难怪当 OO 被认为是这样时它会引起混乱那
  • 我不确定class Parent: public Cousin { 是否是个好主意。派生class Child1: public Parent, Cousin1 { 将有两次基类Cousin(这闻起来像是需要虚拟继承......)
  • 我不明白的是:使用指向Parent 的指针访问Child1 会使虚拟方法doUsefulWork() 不可见。这是一个指向Cousin 的指针,这是必需的。如果反过来,Child3 意外地不是从任何 CousinX 派生的,而 doUsefulWork() 被覆盖,则将其分配给指向 Cousin 的指针会引起麻烦。有一些微妙的东西,我还不知道。

标签: c++ inheritance polymorphism multiple-inheritance pure-virtual


【解决方案1】:

如何防止 Child 子类的作者忘记继承 Cousin 子类?我想要一些会产生编译时错误的东西。

您实现这些接口的原因是必须有使用这些接口的函数。如果对象未实现接口,则在将对象传递给该函数时会出现编译器错误 - 这充当强制检查对象必须实现该接口。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2012-12-12
    • 2016-10-08
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多