2

我有

  class Wrapper : Base
{
Wrapper(WrappedObject& obj)
//...
};

void fun(Base& b);

我希望能够直接funWrappedObject实例调用,这样的隐式转换可能吗?如何?

编辑: http: //ideone.com/ilfE8我仍然无法让这个例子工作,我需要改变什么?谢谢

4

2 回答 2

6

公开继承:

class Wrapper : public Base

事实上,这不是一种is-a关系。private继承(这是类的默认设置)表示一种has-a关系。

class Wrapper : Base

相当于

class Wrapper : private Base

编辑:根据评论,引用必须是 const 因为将创建一个临时的。

于 2012-09-28T14:41:21.877 回答
4

fun如果确实需要通过非常量引用获取其参数,则无法一步完成。原因是为了调用,您需要从 afun创建一个临时对象,但是这个临时对象不能绑定到非常量引用。WrapperWrappedObject

如果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)); }显式创建一个临时对象,这确实具有对未来读者更加明确的优势。Wrapperfun

于 2012-09-28T14:49:47.020 回答