考虑以下一对相关结构的声明。后代类不添加任何成员变量,唯一的成员函数是一个构造函数,它除了将其所有参数转发给基类的构造函数之外什么都不做。
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)
问题的答案,行为未定义。但是,这个问题中的对象是否有可能具有不同的大小?