Рассмотрим следующие объявления пары связанных структур. Класс потомков не добавляет никаких переменных-членов, и единственная функция-член - это конструктор, который ничего не делает, а перенаправляет все свои аргументы на конструктор базового класса.
struct Base {
Base(int a, char const* b):
a(a), b(b)
{ }
int a;
char const* b;
};
struct Descendant: Base {
Descendant(int a, char const* b):
Base(a, b)
{ }
};
Теперь рассмотрим следующий код, используя эти типы. Функция foo
ожидает получить массив Base
. Тем не менее, main
определяет массив Descendant
и передает это значение вместо foo
.
void foo(Base* array, unsigned len)
{
/* <access contents of array> */
}
int main()
{
Descendant main_array[] = {
Descendant(0, "zero"),
Descendant(1, "one")
};
foo(main_array, 2);
return 0;
}
Определено ли поведение этой программы? Ответ зависит от тела foo
, например, записывается ли он в массив или только читается из него?
Если sizeof(Derived)
не соответствует sizeof(Base)
, то поведение undefined соответствует ответам на предыдущий вопрос о базовом указателе на массив производных объектов. Есть ли вероятность, что объекты в этом вопросе будут иметь разные размеры?