首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >私有继承父级,同时在C++中公开继承其祖级

私有继承父级,同时在C++中公开继承其祖级
EN

Stack Overflow用户
提问于 2018-06-07 03:45:33
回答 3查看 400关注 0票数 2

标题说明了这一点。Parent公开了Grandparent,我想让它在Child中公开,但是我想隐藏Parent本身。我不明白为什么这是不可能的,但是我找不到一种使用using指令来实现这一点的方法。如果我可以使用using公开公开私有继承的成员变量,我希望能够对私有继承的基类执行同样的操作,但是我似乎找不到这样的语法。Child中的显式转换操作符可能会起作用,但有没有一种更简洁的方法?

代码语言:javascript
复制
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:既然人们问我为什么需要这个,下面是我的用例。GrandparentParent实现的接口。我希望Child使用Parent来实现和提供这个接口,但要让Parent保持私有。

EN

回答 3

Stack Overflow用户

发布于 2018-06-07 05:36:12

你也可以直接继承Grandparent。这需要virtual继承,这通常是多重继承的情况。

代码语言:javascript
复制
class Grandparent {};

class Parent: virtual public Grandparent {};

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

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

代码语言:javascript
复制
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;
};
票数 1
EN

Stack Overflow用户

发布于 2018-06-07 04:15:56

Parent的角度来看,实现Child有一个概念性的问题,但它只是一个Grandparent

这意味着Parent的契约被打破了,这意味着Child的实现密切依赖于Parent实现的细节,我们使用抽象和封装将我们与这些细节隔离开来是有原因的。

否则,您也可以简单地将Child设置为Parent

因此,C++从未添加任何语法来支持这一点。

票数 0
EN

Stack Overflow用户

发布于 2018-06-08 02:54:50

代码语言:javascript
复制
class Grandparent {
public:
  virtual void foo() = 0;
};

class Parent: public Grandparent {
public:
  virtual void foo() final { std::cout << "Dance!\n"; }
};


template<class D>
struct proxy_Grandparent:Grandparent {
  virtual void foo() final {
    return proxy().foo();
  }
private:
  D* self() { return static_cast<D*>(this); }
  D const* self() const { return static_cast<D const*>(this); }
  decltype(auto) proxy() {
    return self()->get_proxy();
  }
};

class Child: Parent,
  public proxy_Grandparent<Child>
{
  friend class proxy_Grandparent<Child>;
private:
  Parent& get_proxy() { return *this; }
};

这里面有两个Grandparent的副本;如果Grandparent是一个接口,这就不是什么问题了。

实际上,您应该将Parent继承更改为完全的has-a:

代码语言:javascript
复制
class Child:
  public proxy_Grandparent<Child>
{
  friend class proxy_Grandparent<Child>;
private:
  Parent parent;
  Parent& get_proxy() { return parent; }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50728384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档