首页 > 解决方案 > 在 C++ 中公开继承其祖父母的同时私下继承父母

问题描述

标题说了算。Parent公开暴露Grandparent,我想在 中保持公开Child,但我想隐藏它Parent本身。我不明白为什么这不可能,但我找不到使用using指令来实现这一目标的方法。如果我可以using用来公开公开私有继承的成员变量,我希望能够对私有继承的基础做同样的事情,但我似乎无法找到一种语法。显式转换运算符 inChild可能有效,但有更清洁的方法吗?

class Grandparent {};

class Parent: public Grandparent {};

class Child: Parent
{
  // How can I expose Grandparent here publicly?
};

void takeGrandparent( Grandparent const & );

int main()
{
  takeGrandparent( Child() ); // error: cannot cast 'Child' to its private base class 'Grandparent'
}

UPD:既然人们问我为什么需要这个,这是我的用例。Grandparent是一个Parent实现的接口。我想Child用它Parent来实现和提供这个接口,但要保持Parent私有。

标签: c++inheritance

解决方案


也可以直接继承Grandparent。这需要virtual继承,就像多重继承的情况一样。

class Grandparent {};

class Parent: virtual public Grandparent {};

class Child: Parent, virtual public Grandparent
{
  // No special treatment needed, interface is inherited automatically
};

这在私有继承思想的背景下实际上是有意义的。您可能会认为私有继承是“我懒得添加Parent成员Child,所以我将使用继承来实现它”。如果你用组合“正确”地做到这一点,它就会变得更像带有委托的常规代码:

class Grandparent
{
public:
    virtual int GrandparentMethod() {return 8;}
};

class Parent: public Grandparent {};

class Child: public Grandparent
{
public:
    virtual int GrandparentMethod() {return parent.GrandparentMethod();}

private:
    Parent parent;
};

推荐阅读