通过引用传递父对象

Passing parent object by reference

本文关键字:对象 引用      更新时间:2023-10-16

我在一个库中有这样的代码:

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里面发生了什么,有时我甚至不知道里面发生了什么。

我多次使用了pass -parent-by-pointer,并且我已经习惯了,但是以前从未使用过pass -parent-by-reference。

myfunc(*this)是可以的,只要将myfunc声明为引用——它确实是引用。

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

只是让你知道,如果你然后调用多态(例如,virtual)方法在这个Base&,多态性仍然会正常工作,做你所期望的——就像如果你是通过一个指针调用。换句话说:

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

…效果与:

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

不,第一个版本是正确的:

 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,

可以使用显式类型转换的强制转换符号来执行。适用于相同的语义限制和be-行为,除了在以下情况下执行static_cast时,即使基类不可访问,转换也是有效的:

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

如果转换可以用以上列出的一种以上的方式解释,则使用列表中最先出现的解释,即使由该解释产生的强制转换是病态的。如果转换可以以多种方式解释为static_cast后跟const_cast,则该转换是病态的。