En C ++, un objeto de clase derivada se puede asignar a un objeto de clase base, pero no es posible al revés.

class Base { int x, y; };

 

class Derived : public Base { int z, w; };

 

int main() 

{

    Derived d;

    Base b = d;

}

Rebanado de objetos ocurre cuando un objeto de clase derivada se asigna a un objeto de clase base, los atributos adicionales de un objeto de clase derivada se cortan para formar el objeto de clase base.

#include <iostream>

using namespace std;

 

class Base

{

protected:

    int i;

public:

    Base(int a)     { i = a; }

    virtual void display()

    { cout << "I am Base class object, i = " << i << endl; }

};

 

class Derived : public Base

{

    int j;

public:

    Derived(int a, int b) : Base(a) { j = b; }

    virtual void display()

    { cout << "I am Derived class object, i = "

           << i << ", j = " << j << endl;  }

};

 

void somefunc (Base obj)

{

    obj.display();

}

 

int main()

{

    Base b(33);

    Derived d(45, 54);

    somefunc(b);

    somefunc(d); 

    return 0;

}

Producción:

I am Base class object, i = 33
I am Base class object, i = 45

Podemos evitar el comportamiento inesperado anterior con el uso de punteros o referencias. La división de objetos no ocurre cuando se pasan punteros o referencias a objetos como argumentos de función, ya que un puntero o referencia de cualquier tipo ocupa la misma cantidad de memoria. Por ejemplo, si cambiamos el método global myfunc () en el programa anterior a siguiente, la división de objetos no ocurre.

void somefunc (Base &obj)

{

    obj.display();

}           

/ div>

Producción:

I am Base class object, i = 33
I am Derived class object, i = 45, j = 54

Obtenemos el mismo resultado si usamos punteros y cambiamos el programa a siguiente.

void somefunc (Base *objp)

{

    objp->display();

}

 

int main()

{

    Base *bp = new Base(33) ;

    Derived *dp = new Derived(45, 54);

    somefunc(bp);

    somefunc(dp); 

    return 0;

}

Producción:

I am Base class object, i = 33
I am Derived class object, i = 45, j = 54

La división de objetos se puede evitar haciendo que la función de la clase base sea puramente virtual al no permitir la creación de objetos. No es posible crear el objeto de una clase que contenga un método virtual puro.


También podría gustarte

Suscríbete a nuestro boletín

Usamos cookies para brindar y mejorar nuestros servicios. Al utilizar nuestro sitio, acepta nuestra Política de cookies.


Aprende más

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *