OriginalGriff
Просто: этот код не компилируется. Итак, то, что вы запускаете, - это вывод из другого набора кода. oint
это не известный тип для начинающих.
Но если бы это было так, то он не сделал бы того, что вы думаете, и причина в этом:
void SomeFunc(base *arr,int size)
{
for(iont i=0;i<size;i++,arr++)
cout<<arr->bval;
deri DeriArr[5];
SomeFunc(DeriArr,5);
Когда вы передаете DeriArr в SomeFunc, он поступает как Base* - что вполне допустимо, так как имя массива является указателем на первый элемент в массиве, а Deri является производным от Base, поэтому указатель на Deri является допустимым указателем на базу.
Но затем вы увеличиваете указатель:
arr++
как часть цикла for.
Что касается SomeFunc, то arr-это указатель на базу, поэтому ++ добавляет к указателю размер базы в байтах. Но Deri больше, чем Base - у него есть дополнительное целое число. Таким образом, приращение указателя не указывает на следующий элемент Deri, он указывает на следующий базовый элемент и заканчивается на полпути через экземпляр Deri. И вот: вы получаете результат, который видите.