通过引用传递父对象
Passing parent object 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);
}
};
传递*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,则该转换是病态的。
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++对象引用返回不同的值
- 对象引用中的字段以不同的方法返回不同的值
- 通过向构造函数其他对象引用页面来创建对象
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- 如何在C++中读取 HDF5 对象引用
- C++ 未定义的对象引用
- 从函数返回 libconfig 类设置对象引用
- qt vsaddin错误对象引用未设置为对象的istanse
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- C :将对象引用作为参数给出错误:呼叫class :: function()的匹配函数
- C++OOP基础知识-是否正确返回对象引用
- 使用对象引用(可能)在调用destructor后使用对象引用
- 创建返回对象引用的成员函数的最简单方法
- 如何在C++上使用对象引用删除对象
- JNI/Android NDK-维护全局对象引用
- 为什么有些类方法返回"*this"(self的对象引用)?
- 在C++中返回伪对象引用的规则