Articulo de referencia

Segmentación de objetos

En la programación en C++ , el seccionamiento de objetos ocurre cuando un objeto de un tipo de subclase se copia a un objeto de un tipo de superclase: la copia de la superclase ...

En la programación en C++ , el seccionamiento de objetos ocurre cuando un objeto de un tipo de subclase se copia a un objeto de un tipo de superclase: la copia de la superclase no tendrá ninguna de las variables miembro ni las funciones miembro definidas en la subclase. Estas variables y funciones, en efecto, han sido "seccionadas". [ 1 ] [ 2 ]

De forma más sutil, el seccionamiento de objetos también puede ocurrir cuando un objeto de un tipo de subclase se copia a un objeto del mismo tipo mediante el operador de asignación de la superclase , en cuyo caso algunas de las variables miembro del objeto de destino conservarán sus valores originales en lugar de copiarse desde el objeto de origen.

Este problema no es exclusivo de C++, pero no se presenta de forma natural en la mayoría de los demás lenguajes orientados a objetos —ni siquiera en sus parientes, como D , Java y C# —, ya ​​que la copia de objetos no es una operación básica en dichos lenguajes. En cambio, estos lenguajes prefieren manipular objetos mediante referencias implícitas, de modo que solo copiar la referencia es una operación básica. Por el contrario, en C++ los objetos se copian automáticamente cuando una función recibe un objeto como argumento por valor o devuelve un objeto por valor. De forma similar, esto no ocurre en Rust , ya que Rust carece de herencia.

Además, debido a la falta de recolección de basura en C++, los programas copian frecuentemente un objeto cuando la propiedad y el ciclo de vida de un objeto compartido no están claros. Por ejemplo, insertar un objeto en una colección de la biblioteca estándar (como una lista std::vector) generalmente implica crear e insertar una copia en la colección.

Al utilizar el encadenamiento de métodos y el patrón de interfaz fluida , existe un riesgo potencial de seccionamiento de objetos en C++ si se llama a un método de una clase base en una clase derivada que devuelve una referencia a la clase base.

El seccionamiento de objetos ha sido objeto de críticas por sus sutilezas. [ 3 ]

Ejemplo

clase Base { privado : int a ; público : Base explícita ( int a ) : a { a } {} };clase Derivada : pública Base { privada : int b ; pública : explícita Derivada ( int a , int b ) : Base { a }, b { b } {} };Derivado & getDerived () { static Derived derivado ( 1 , 2 ); return derivado ; }int main () { // Asignación normal por valor a una base base ( 3 ) ; // base.a == 3 base = getDerived (); // base.a == 1, derived.b no se copia a la baseDerivado derivado ( 3 , 4 ); // derivado.a == 3, derivado.b == 4 Base & base2 = derivado ; // Asignación parcial por valor a través de referencia a derivado base2 = obtenerDerivado (); // derivado.a == 1, derivado.b == 4 !devolver 0 ; }

Véase también

Referencias

  1. R., Subburaj (2013). Programación orientada a objetos con C++ según la norma ANSI/ISO . Editorial Vikas. págs.  260-261. ISBN 978-93-259-6996-4.
  2. Grimes, Richard (24 de abril de 2017). Introducción a la programación en C++ . Birmingham: Packt Publishing Ltd. pág. 309. ISBN  978-1-78712-928-3.
  3. Alex Pomeranz (28 de octubre de 2024). "25.9 - Segmentación de objetos" . learncpp.com . LearnCpp.Com.