C ++: копировать данные объекта в функцию-член базового класса - PullRequest
6 голосов
/ 11 мая 2011

Предположим, у меня есть два класса A, и B. B получен из A. В A нет элементов данных, однако B имеет два целочисленных элемента.

Если я определю метод в классе A, как показано ниже:

void CopyFrom( const A* other )
{
    *this = *other;
}

И назовите его в дочернем классе, будет ли скопирован целочисленный элемент данных?

Ответы [ 2 ]

7 голосов
/ 11 мая 2011

Нет. Это известно как проблема нарезки .

Это верно, даже если вы перегрузите operator= в A и B: *this = *other разрешит только вызов A::operator=(const A&) или B::operator=(const A&).

3 голосов
/ 11 мая 2011

Нет. this не имеет места для членов дочернего класса. Так что члены класса Derived будут просто отрезаны. Эта проблема называется Object Slicing.

Как это решить?
Профилактика лучше лечения!

Не вводите свой код в ситуацию, когда происходит Object Slicing.
Если вы столкнулись с проблемой Object Slicing, у вас плохо спроектированная / разработанная программа. Если, конечно, вы жертвуете хорошим дизайном ООП в пользу целесообразности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...