【问题标题】:Passing parent object by reference通过引用传递父对象
【发布时间】:2012-01-05 02:23:02
【问题描述】:

我在库中有这段代码:

class Parent
{
    //some data and functions
};

void myfunc(Parent& ref);

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

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

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

myfunc( * ((Parent*)this) )

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

我多次使用过指针传递,我已经习惯了,但之前从未使用过传递父引用。

【问题讨论】:

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


    【解决方案1】:

    myfunc(*this) 没问题,只要声明myfunc 接受引用——就是这样。

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

    您知道,如果您在此 Base& 上调用多态(例如,virtual)方法,多态仍然可以正常工作并执行您所期望的 - 就像您要调用通过指针。换句话说:

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

    ...将具有相同的效果:

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

    【讨论】:

      【解决方案2】:

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

       myfunc(*this);
      

      第二个版本可能会在这种情况下工作,但我不相信它会在涉及多重继承的所有情况下工作(因为您使用的是 C 样式转换)。我必须拿出我的标准来看看 C-Style cast 的确切行为。

      如果它可以通过指针传递,那么如果您转换为使用引用,同样的技术也将起作用。

      更新:

      现在我已经阅读了标准,我看到 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 时,即使基类不可访问,转换也是有效的:

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

      如果转换可以通过以上列出的一种以上方式解释,则使用列表中第一个出现的解释,即使由该解释产生的强制转换是格式错误的。如果转换可以以多种方式解释为 static_cast 后跟 const_cast,则该转换格式错误。

      【讨论】:

      • 它说的是“明确的基类类型”,所以也许在某些情况下它不起作用
      猜你喜欢
      • 2017-09-11
      • 2011-07-06
      • 2012-07-07
      • 2012-07-16
      • 2011-12-12
      • 2013-11-24
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多