我有
class Wrapper : Base
{
Wrapper(WrappedObject& obj)
//...
};
void fun(Base& b);
我希望能够使用fun
实例直接调用WrappedObject
,这样的隐式转换是否可行?如何?
编辑: http://ideone.com/ilfE8我仍然不能让这个例子起作用,我需要改变什么? 感谢
答案 0 :(得分:6)
将继承公开:
class Wrapper : public Base
实际上,这不是is-a
关系。 private
继承(这是类的默认值)表示has-a
关系。
class Wrapper : Base
相当于
class Wrapper : private Base
编辑:根据评论,引用必须是const,因为将创建临时。
答案 1 :(得分:4)
如果fun
确实需要通过非const引用获取其参数,则无法一步完成此操作。原因是为了调用fun
,您需要从Wrapper
创建一个临时WrappedObject
,但这个临时不能绑定到非const引用。
如果fun
可以将其参数作为const引用,那么您只需要将继承更改为public
,如另一个答案所示,并使fun
的参数为const。然后你可以完全按照你的要求去做。
如果fun
必须通过非const引用获取其参数,则拥有来创建一个命名临时对象以传递给它:
Wrapper wrap(wrapped_obj);
fun(wrap);
最后请注意,虽然隐式构造函数很方便,但它们通常会抑制代码理解并导致难以发现的错误。请记住,您只编写一次代码并明确地拼写出转换(而不是隐式转换构造函数)将导致更容易阅读的代码并使错误更加突出。
编辑:经过进一步检查,我不相信你的原始目标可以在C ++中实现。 (联合国)幸运的是,由于规则,它无法使用多个隐式步骤(构造临时Wrapper
,隐式强制转换为Base
)来调用该函数。你必须帮忙。
可能最简单的方法是重载fun(const Wrapper& w) { fun(static_cast<const Base&>(w)); }
,而备用方法是在Wrapper
本身的调用中显式创建临时fun
对象,这确实具有略微优势对未来的读者更明确。