哎呀,垂头丧气

时间:2018-09-07 23:54:54

标签: c++ oop downcast

postgree

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

2 个答案:

答案 0 :(得分:5)

  

任何人都可以解释原因和方式吗?

dataParent的基数,因此可以很好地实现从类型B_childParent *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

  1. 可以在不取消引用类指针的情况下查找和调用该方法
  2. 方法本身不需要取消引用类指针。

一旦方法变为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);
}