class Parent
{};
class A_child : public Parent
{
  void A_method();
};
class B_child : public Parent
{
  void B_method();
};
void main()
{
  A_child a;
  Parent *p = &a;
  B_child *b = (B_child*)&p;
  b->B_method();
}


这段代码是C ++。当我们试图将“猫”转换为“狗”时,这是一个逻辑错误。但这有效。谁能解释原因和方式?

最佳答案

谁能解释原因和方式?


ParentB_child的基数,因此可以很好地实现从类型Parent *pB_child*的转换。但是,仅当p确实指向B_child实例的基础子对象时,才定义通过此转换后的指针访问指向的对象的行为。

前提条件不成立,因此程序的行为是不确定的。可能的行为包括,但不能保证以下行为:

 - working
 - not working
 - random output
 - non-random output
 - the expected output
 - unexpected output
 - no output
 - any output
 - crashing at random
 - crashing always
 - not crashing at all
 - corruption of data
 - different behaviour, when executed on another system
 -                    , when compiled with another compiler
 -                    , on tuesday
 -                    , only when you are not looking
 - same behaviour in any or all of the above cases
 - anything else within the power of the computer (hopefully limited by the OS)




除非您可以证明强制转换正确,否则切勿将static_castreinterpret_cast或C样式将表达式转换为其他类型。如果不确定,可以使用dynamic_cast

关于c++ - 哎呀,垂头丧气,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52230836/

10-11 04:41