c++ - 在 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
私有。
解决方案
也可以直接继承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;
};
推荐阅读
- mysql - 选择名称 WHERE 指向正方形
- microsoft-teams - 为 ms 团队中的任务模块添加关闭按钮
- typescript - 当我的 tsconfig.json 中只有 include=["src"] 时,为什么需要 exclude=["node_modules"]?
- pandas - LSTM Keras 输入和输出维度
- json - 具有多个步骤和嵌套字段的角度形式
- bitcoin - 比特币 SPV 客户端如何知道它没有错过来自完整节点的区块?
- regex - 正则表达式“包含 10-14 位数字”的正则前瞻无法正常工作
- django-models - 如果为空,则返回另一个表的值
- c# - 在 ActiveMQ 中配置通配符主题选择器
- python - groupby 操作后按月对数据帧进行排序