You*_*usf 6 c++ oop inheritance pass-by-reference
我在库中有这个代码:
class Parent
{
//some data and functions
};
void myfunc(Parent& ref);
Run Code Online (Sandbox Code Playgroud)
我想在我的应用程序中执行此代码:
class Child : public Parent
{
// some other data and functions
void dostuff()
{
myfunc(*this);
}
};
Run Code Online (Sandbox Code Playgroud)
通过*这是安全的吗?(没有切片,没有复制,......)最好像这样调用myfunc:
myfunc( * ((Parent*)this) )
Run Code Online (Sandbox Code Playgroud)
请注意,我无法控制myfunc内部发生的事情,在某些情况下我甚至不知道里面发生了什么.
我多次使用pass-parent-by-pointer并且我习惯了它,但之前从未使用过传递父对象.
Joh*_*ing 10
myfunc(*this)只要myfunc被宣布为参考 - 这就是好的.
这不会复制对象.它将传递对原始对象的引用.此外,它不会切割对象.引用将是类型Base&,但它引用的对象将保持不变.
就这么你知道,如果你virtual在这个上调用多态(例如)方法Base&,多态仍然可以正常工作并按照你的期望行事 - 就像你要通过指针调用一样.换一种说法:
Base& b = *derived;
b.SomeVirtualFoo();
Run Code Online (Sandbox Code Playgroud)
...将具有与以下相同的效果:
Base* b = derived;
b->SomeVirtualFoo();
Run Code Online (Sandbox Code Playgroud)
没有第一个版本是正确的:
myfunc(*this);
Run Code Online (Sandbox Code Playgroud)
第二个版本可能适用于这种情况,但我不相信它会在所有情况下都有效,如果涉及多个继承(因为你使用的是C样式转换).我必须拿出我的标准来看看C-Style演员的确切行为.
如果它通过指针传递,则转换为使用引用时,相同的技术将起作用.
现在我已经阅读了标准,我看到C-Cast将做正确的事情(因为static_cast <>可用于将类层次结构从子级转换为父级).
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,则转换形式不正确.