Рубрики

Нарезка объектов в C ++

В C ++ объект производного класса может быть назначен объекту базового класса, но другой путь невозможен.

class Base { int x, y; };

  

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

  

int main() 

{

    Derived d;

    Base b = d; // Объектная нарезка, z и w из d вырезаны

}

Разрезание объектов происходит, когда объект производного класса назначается объекту базового класса, дополнительные атрибуты объекта производного класса вырезаются для формирования объекта базового класса.

#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);  // Объектная нарезка, член j of d обрезан

    return 0;

}

Выход:

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

Мы можем избежать выше неожиданного поведения с использованием указателей или ссылок. Разделение объектов не происходит, когда указатели или ссылки на объекты передаются в качестве аргументов функции, поскольку указатель или ссылка любого типа занимает одинаковое количество памяти. Например, если мы изменим глобальный метод myfunc () в приведенной выше программе на следующий, нарезка объектов не произойдет.

// остальной код похож на выше

void somefunc (Base &obj)

{

    obj.display();

}           
// остальной код похож на выше

Выход:

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

Мы получаем тот же результат, если мы используем указатели и меняем программу на следующую.

// остальной код похож на выше

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;

}

Выход:

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

Срез объектов можно предотвратить, сделав функцию базового класса чисто виртуальной, запретив создание объектов. Невозможно создать объект класса, который содержит чисто виртуальный метод.

Эта статья предоставлена Pravasi Meet . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Нарезка объектов в C ++

0.00 (0%) 0 votes