【发布时间】:2023-03-06 21:06:01
【问题描述】:
我有一个Parent 课程和两个Child 课程:
class Parent
{
};
class Child1: public Parent
{
};
class Child2 : public Parent
{
};
我想要第二个类层次结构,类 Cousin 位于层次结构的顶部,子类称为 Cousin1、Cousin2 等:
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实际上意味着每个Childis-aParent,难怪当 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