在C+中使用不正确的向下转换访问基类成员+; 下面的C++代码是否正确?< /P> struct Base { int x; }; struct Derived : Base { int y; } Base * b = new Base; Derived * d = static_cast<Derived *>(b); //below we access only d->x, but not d->y std::cout << d->x; struct Base{int x;}; 派生结构:基{int y;} 基准*b=新基准; 导出*d=静态_转换(b); //下面我们只访问d->x,但不访问d->y std::cout x;

在C+中使用不正确的向下转换访问基类成员+; 下面的C++代码是否正确?< /P> struct Base { int x; }; struct Derived : Base { int y; } Base * b = new Base; Derived * d = static_cast<Derived *>(b); //below we access only d->x, but not d->y std::cout << d->x; struct Base{int x;}; 派生结构:基{int y;} 基准*b=新基准; 导出*d=静态_转换(b); //下面我们只访问d->x,但不访问d->y std::cout x;,c++,language-lawyer,C++,Language Lawyer,如果没有,到底是什么问题?C++标准对此有何看法?至少我从未见过它崩溃。这在(我的)中相当简单: 如果cv2的cv鉴定与cv1相同或大于cv1,则“指向cv1 B的指针”类型的PR值(其中B为类别类型)可转换为“指向cv2 D的指针”类型的PR值,其中D为从B派生的类别。如果B是D的虚拟基类或D的虚拟基类的基类,或者如果不存在从“指向D的指针”到“指向B的指针”的有效标准转换([conv.ptr]),则程序格式错误。空指针值将转换为目标类型的空指针值如果“指向cv1 B的指针”类型的prvalu

如果没有,到底是什么问题?C++标准对此有何看法?至少我从未见过它崩溃。

这在(我的)中相当简单:

如果cv2的cv鉴定与cv1相同或大于cv1,则“指向cv1 B的指针”类型的PR值(其中B为类别类型)可转换为“指向cv2 D的指针”类型的PR值,其中D为从B派生的类别。如果B是D的虚拟基类或D的虚拟基类的基类,或者如果不存在从“指向D的指针”到“指向B的指针”的有效标准转换([conv.ptr]),则程序格式错误。空指针值将转换为目标类型的空指针值如果“指向cv1 B的指针”类型的prvalue指向实际上是D类型对象的子对象的B,则生成的指针指向D类型的封闭对象。否则,行为未定义。

您没有派生的
的子对象,因此它是未定义的行为



注意:左值或x值指针没有特殊情况,/8提到操作数进行左值到右值的转换。

x
y
在这里是私有的。
Base b=new Base为您提供了一个
基础
。你不能只是神奇地从中获得一个
派生的
。仅仅因为这个简单的例子有效并不意味着你可以依赖它在其他情况下工作。
静态\u cast
定义良好的规则可以在这里找到:@NathanOliver的问题其实并不那么明显,OP提到他只通过
d
访问
Base
成员