如何使这个演员隐含?

时间:2012-09-28 14:40:54

标签: c++

我有

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

void fun(Base& b);

我希望能够使用fun实例直接调用WrappedObject,这样的隐式转换是否可行?如何?

编辑: http://ideone.com/ilfE8我仍然不能让这个例子起作用,我需要改变什么? 感谢

2 个答案:

答案 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对象,这确实具有略微优势对未来的读者更明确。