标题说明了这一点。Parent
公开了Grandparent
,我想让它在Child
中公开,但是我想隐藏Parent
本身。我不明白为什么这是不可能的,但是我找不到一种使用using
指令来实现这一点的方法。如果我可以使用using
公开公开私有继承的成员变量,我希望能够对私有继承的基类执行同样的操作,但是我似乎找不到这样的语法。Child
中的显式转换操作符可能会起作用,但有没有一种更简洁的方法?
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
保持私有。
发布于 2018-06-07 05:36:12
你也可以直接继承Grandparent
。这需要virtual
继承,这通常是多重继承的情况。
class Grandparent {};
class Parent: virtual public Grandparent {};
class Child: Parent, virtual public Grandparent
{
// No special treatment needed, interface is inherited automatically
};
这实际上在私有继承思想的上下文中是有意义的。您可能会认为私有继承是“我懒得向Child
添加Parent
成员,所以我将使用继承来实现它”。如果你“正确地”使用组合,它就会变得更像是使用委托的常规代码:
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;
};
发布于 2018-06-07 04:15:56
从Parent
的角度来看,实现Child
有一个概念性的问题,但它只是一个Grandparent
这意味着Parent
的契约被打破了,这意味着Child
的实现密切依赖于Parent
实现的细节,我们使用抽象和封装将我们与这些细节隔离开来是有原因的。
否则,您也可以简单地将Child
设置为Parent
。
因此,C++从未添加任何语法来支持这一点。
发布于 2018-06-08 02:54:50
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:
class Child:
public proxy_Grandparent<Child>
{
friend class proxy_Grandparent<Child>;
private:
Parent parent;
Parent& get_proxy() { return parent; }
};
https://stackoverflow.com/questions/50728384
复制相似问题