postgree
这段代码是C ++。当我们试图将“猫”转换为“狗”时,这是一个逻辑错误。但这有效。谁能解释原因和方式?
答案 0 :(得分:5)
任何人都可以解释原因和方式吗?
data
是Parent
的基数,因此可以很好地实现从类型B_child
到Parent *p
的转换。但是,只有在B_child*
实际上指向p
实例的基础子对象的情况下,才能定义通过此转换后的指针访问指向的对象的行为。
先决条件不成立,因此程序的行为是不确定的。可能的行为包括,但不能保证以下任何一种行为:
B_child
除非{em> you 可以证明转换正确,否则 - 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
或C样式都不能将表达式转换为其他类型。如果不确定,可以使用reinterpret_cast
。
答案 1 :(得分:3)
这是可能但不能保证不会引起错误,因为您的B_method有效地 static
。
一旦方法变为virtual
(现在需要访问vtable的类指针以查找函数地址),访问类数据,或者您打喷嚏或看着编译器很有趣,您就会处理未绑定的内存访问。
我要强调的是,尽管假设的编译器不需要引用类指针,但允许这样做,并且任何特定的编译器实现都可以 。
进一步阅读...检查接受的答案Difference between Object and instance : C++,直到访问与该类的特定实例相关联的instance data
,您的类指针才可能出现。
或者...另一种方式来表达所有这些。如果可以在函数声明前加上static
,则可以使用无效的指针进行调用。
另请参阅:
class MyClass
{
public:
int doSomething(int x)
{
printf("%d", x);
return x;
}
};
int main()
{
MyClass *pMyClass = nullptr;
pMyClass->doSomething(42);
}