Я просто столкнулся с фрагментом кода, который мне кажется довольно странным (см. Ниже в качестве минимального примера), derived::base
является ссылкой на другой объект типа base
, может кто-нибудь мне помочь ответить на вопросы в комментариях?базовый класс является ссылкой на другой объект
class base{
public:
int a;
int b;
};
class derived : public base{
public:
double c;
void run(const base & bs){
((base &) *this) = bs; // what does this line do?
// Is derived::base now a copy of bs?
// If yes, but why not write ((base) *this) = bs?
// if not, then derived::base is a reference to bs,
// then does it mean the memory of derived::base
// and members of derived are no longer contiguous?
std::cout << "a = " << a << std::endl;
}
};
PS
комментарии @LightnessRacesinOrbit помогли многое прояснить вопросы, но я могу только принимать почту ответ, лучше всего по @WhiZTiM
Все это делает вызов конструктора копирования базового класса, который скопирует элементы базового класса (то есть 'a' и' b'), не касаясь ничего в производной части объекта (т. Е. 'C'). Я не понимаю, почему память больше не будет соприкасающейся. – imreal
afaik у вас никогда не было гарантии, что члены объектов хранятся в непрерывной памяти, даже без этого «копирования только базовых членов класса». Возможно, есть какое-то недоразумение в отношении значения «смежных». Можете ли вы объяснить немного больше, что именно вас беспокоит по поводу этого кода? – user463035818
@imreal, но почему бы не написать '((base) * this) = bs' при вызове конструктора копирования? – Allanqunzi