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 ++。当我们试图将“猫”转换为“狗”时,这是一个逻辑错误。但这有效。谁能解释原因和方式?
最佳答案
谁能解释原因和方式?Parent
是B_child
的基数,因此可以很好地实现从类型Parent *p
到B_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_cast
,reinterpret_cast
或C样式将表达式转换为其他类型。如果不确定,可以使用dynamic_cast
。关于c++ - 哎呀,垂头丧气,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52230836/