通过引用传递父对象

时间:2011-11-23 19:47:24

标签: c++ oop inheritance pass-by-reference

我在库中有这个代码:

class Parent
{
    //some data and functions
};

void myfunc(Parent& ref);

我希望在我的应用程序中执行此代码:

class Child : public Parent
{
   // some other data and functions
   void dostuff()
   {
       myfunc(*this);
   }
};

通过*这是安全的吗? (没有切片,没有复制,......) 这样调用myfunc会更好:

myfunc( * ((Parent*)this) )

请注意,我无法控制myfunc内部发生的事情,在某些情况下我甚至不知道里面发生了什么。

我多次使用pass-parent-by-pointer而且我习惯了它,但之前从未使用过传递父对象。

2 个答案:

答案 0 :(得分:10)

myfunc(*this)很好,只要myfunc声明为引用 - 它就是。

这不会复制对象。它将传递对原始对象的引用。此外,它不会切割对象。引用的类型为Base&,但它引用的对象将保持不变。

您知道,如果您在此virtual上调用多态(例如,Base&)方法,那么多态仍然可以正常工作并按照您的期望行事 - 就像你是通过指针来打电话的。换句话说:

Base& b = *derived;
b.SomeVirtualFoo();

...将具有与以下相同的效果:

Base* b = derived;
b->SomeVirtualFoo();

答案 1 :(得分:5)

没有第一个版本是正确的:

 myfunc(*this);

第二个版本可能适用于这种情况,但我不相信它会在所有情况下都有效,如果涉及多个继承(因为你使用的是C样式转换)。我必须拿出我的标准来看看C-Style演员的确切行为。

如果它通过指针传递,则转换为使用引用时,相同的技术将起作用。

更新

现在我已经阅读了标准,我看到C-Cast会做正确的事情(因为static_cast<>可用于将类层次结构从子级转换为父级)。

5.4显式类型转换(强制转换符号)

  

4执行的转换    - const_cast(5.2.11),
   - static_cast(5.2.9),
   - static_cast后跟const_cast,
   - reinterpret_cast(5.2.10)或
   - reinterpret_cast后跟const_cast,

     

可以使用显式类型转换的强制转换表示法执行。应用相同的语义限制和行为,但在以下情况下执行static_cast时,即使基类不可访问,转换也是有效的:

     

- 指向派生类类型的对象或派生类类型的左值或右值的指针可以分别显式转换为指针或对明确基类类型的引用;
   - 指向派生类类型成员的指针可以显式转换为指向非明确的非虚基类类型成员的指针;
   - 指向明确的非虚基类类型的对象的指针,明确的非虚基类类型的glvalue,或指向非明确的非虚基类类型的成员的指针可以被显式地转换为指针,分别是引用或指向派生类类型成员的指针。

     

如果转换可以用上面列出的多种方式解释,则使用列表中首先出现的解释,即使由该解释产生的转换形式不正确也是如此。如果转换可以多种方式解释为static_cast,后跟const_cast,则转换形式不正确。