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