【发布时间】:2013-07-29 07:22:20
【问题描述】:
我可以这样做吗?
class A { ... };
class B : private A
{
const A &foo() const
{
return *((const A *)this);
}
};
我可以采用从基类私有继承的子类并将其转换为基类的公共版本吗?如果没有虚拟方法,我可以这样做吗?
我的猜测是肯定的,但我想确保它是安全/便携的。
【问题讨论】:
-
我不确定我会说这是可能的,尽管这有点违背私有继承的目的......
-
按照“私有”继承的含义,我会说这不是一件好事。这种继承意味着“是根据”实现的,而公共继承是一种“is-a”关系。
-
为什么我想要这个可怕的 hack:关键是从存储配置的键/值字典继承,通常将此字典隐藏在友好的方法后面以获取/设置各种配置项,但随后能够快速返回字典本身。返回一个副本是可以的,但我想知道我是否可以返回 const 'this'。显然没有必要,但从代码清洁度和惯用代码 POV 来看并非毫无意义。
-
这是合法的,你不需要 C 风格的演员表。事实上,可以在外部使用 C 样式转换来打破
private关系:B b; A& ar = *(A*)&b;即使在B类之外也很乐意编译(即访问说明符被 C 样式转换忽略) -
你为什么要这样做? -- 我见过类似的东西用于将接口与实现分开。在您的类型提供 X 的接口上,实现是通过在需要您扩展类型
T的特定 API 中注册来完成的。从T继承不是您的接口,是您特定实现的要求,如果您更改提供程序,则可以删除该继承而不影响用户代码。
标签: c++ casting upcasting private-inheritance