Geo*_*ge2 9 c++ oop inheritance visual-studio-2008
它在C++ FAQ网站中提到 - "当通过值作为基类对象传递时,较大的派生类对象被切片",切片是什么意思?任何样品要展示?
http://www.parashift.com/c++-faq-lite/value-vs-ref-semantics.html#faq-31.8
我使用VSTS 2008 +本机C++作为我的开发环境.
Jac*_*cob 13
引用这个讲座:
切片
假设类D是从类C派生的.我们可以将D视为具有一些额外数据和方法的类C. 就数据而言,D具有C具有的所有数据,并且可能更多.在方法方面,D不能隐藏C的任何方法,并且可能有其他方法.就C的现有方法而言,D唯一能做的就是用自己的版本覆盖它们.
如果x是D类的对象,那么我们可以通过丢弃所有生成xa D的扩展并仅保留C部分来相对于C切片x.切片的结果始终是C类的对象.
切片http://webdocs.cs.ualberta.ca/~hoover/Courses/201/201-New-Notes/lectures/slides/slice/slide1.gif
设计原则:相对于父类C切片对象仍然应该生成一个格式良好的C类对象.
使用警告:即使D是-a C,你也必须小心.如果您有一个C的参数类型并且您提供了D,那么如果您按值,指针或引用进行调用,它将被切片.请参阅下面的示例.
关于虚函数的注意事项 他们的签名用于识别要执行的签名.
注意切片=运算符,它可以使lhs不一致.此外,operator =永远不是虚拟的,它没有意义.例如,假设类A,B都是类C的子类.仅仅因为A是C,而B是C,它并不意味着您可以将B对象分配给A对象.如果没有运行时类型信息,则无法进行安全分配.
切片意味着派生的类信息丢失。基类参数强制创建基类的对象,该对象与派生类共享相同的基类状态。例如:
struct B { int x; };
struct D : B { double y; };
void f(B b) {}
int main() {
D d;
f(d);
}
Run Code Online (Sandbox Code Playgroud)
在该功能中,f您将无法访问D::y。
编辑:感谢大家的编辑。请确保修改会增加价值。注意
structs默认继承是public。