派生类没有额外的数据成员;将基础对象静态向下转换为派生对象是否安全?

时间:2017-01-10 10:43:43

标签: c++ inheritance undefined-behavior downcast

struct Base {
  int i, j;
};

struct Derived : Base {};

在上述情况下,如果我们执行以下操作:

Base b;
auto& d = static_cast<Derived&>(b);
d.i = 1;

这是不确定的行为吗?

注意:由于某些原因,我无法编辑自动生成的Google protobuf库的代码。因此,将这些类扩展到我的自定义类,它提供了更多类型和类型。 API,但它没有任何额外的数据成员。

1 个答案:

答案 0 :(得分:4)

是的,这是未定义的行为。使用static_cast从基类转换为对象不是实例的派生类型是未定义的行为。

此外,您通过无效类型的变量(不是动态类型,动态类型的基类,charunsigned char类型访问对象来打破严格别名规则,并且其他几个案例)。