Как компилятор C ++ знает размер объекта с суперклассами

Точно так, как говорится в вопросе!

Допустим, у меня есть следующий фрагмент

class A
{
int x;
int y;
}

class B : public A
{
int z;
}

class C
{
A a;

public C(A a) : a(a){}
}

Что произойдет, если я вызову конструктор C с классом B, скопирует ли он данные части A в класс? Или тоже где-то хранить данные B?

Заранее спасибо! Это может быть глупый вопрос, но я так и не понял.

2

Решение

Если вы передаете экземпляр B к C конструктор, который принимает A по значению B экземпляр будет нарезан, и просто A часть останется. Так :

Будет ли это скопировать это данные части в классе?

этот.

Так что конкретно нет возможности повернуть C::a член обратно в B экземпляр с тем же значением для z как оригинал B экземпляр — эта информация была потеряна во время (необратимой) операции среза.

5

Другие решения

Что произойдет, если я вызову конструктор C с классом B, скопирует ли он данные части A в класс?

Да. Это известно как нарезка — аргумент создан с использованием AКопируй конструктор, который просто копирует A субобъект.

Или тоже где-то хранить данные B?

Нет.

3

По вопросам рекламы [email protected]