请输入您要查询的百科知识:

 

词条 Object slicing
释义

  1. Example

  2. See also

  3. External links

{{About|object-oriented programming|other uses of slicing|Slicing (disambiguation)}}{{Unreferenced|date=July 2009}}

In C++ programming, object slicing occurs when an object of a subclass type is copied to an object of superclass type: the superclass copy will not have any of the member variables defined in the subclass. (These variables have, in effect, been "sliced off".) More subtly, object slicing can also occur when an object of a subclass type is copied to an object of the same type by the superclass's assignment operator, in which case some of the target object's member variables will retain their original values instead of being copied from the source object.

This issue is not inherently unique to C++, but it does not occur naturally in most other object-oriented languages — even C++'s relatives such as D, Java, and C# — because copying of objects is not a basic operation in those languages. (Instead, those languages prefer to manipulate objects via implicit references, such that only copying the reference is a basic operation.) In C++, by contrast, objects are copied automatically whenever a function takes an object argument by value or returns an object by value. Additionally, due to the lack of garbage collection in C++, programs will frequently copy an object whenever the ownership and lifetime of a single shared object would be unclear; for example, inserting an object into a standard-library collection, such as a std::vector, actually involves inserting a copy into the collection.

Example

struct A

{
    A(int a) : a_var(a) {}    int a_var;

};

struct B : public A

{
    B(int a, int b) : A(a), b_var(b) {}    int b_var;

};

B &getB()

{
    static B b(1, 2);    return b;

}

int main()

{
    // Normal assignment by value to a    A a(3);  //a.a_var ==3    a = getB();    // a.a_var == 1, b.b_var not copied to a

//b2.a_var==3 ,b2.b_var==4

    A &a2 = b2;    // Partial assignment by value through reference to b2    a2 = getB();    // b2.a_var == 1, b2.b_var == 4!

}

See also

  • Diamond problem

External links

  • [https://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c What is the slicing problem in C++?]
{{DEFAULTSORT:Object Slicing}}

2 : Object-oriented programming|Articles with example C++ code

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/11/12 1:30:50