在阅读this question之后,我看到Naveen的答案包含指向this页面的链接,基本上说,从Derived **到Base **的转换是禁止的,因为可能会将指针更改为指向Derived1对象的指针指向Derived2对象的指针(如:*derived1PtrPtr=derived2Ptr
)。
好的,我明白这是邪恶的......
但是当将Derived**
投射到Base*const*
时,这甚至都不可能,那么最终是不允许这样做的原因是什么?
答案 0 :(得分:2)
首先,如果你真的需要,可以将任何指针类型转换为任何其他指针类型。例如,您可以转换为void*
作为中间步骤。
其次,通过指针指针,并不是因为没有特殊规则可以使特定案例变得容易,所以没有理由让特定案例变得困难。
基本上,你有一个指向X
的指针 - 在你的情况下X
碰巧是另一个指针。一些X
个案件得到特殊处理(例如派生类可以隐式地转换为基础) - 但是您的X
不是其中之一。它不是基类 - 它是一个指针。除了derived**
之外,没有为void*
定义隐式强制转换 - 您甚至无法隐式地将derived**
强制转换为void**
。
我不认为const
在这种情况下与它有很大关系,尽管我可能会遗漏一些东西。
答案 1 :(得分:0)
在多重继承的情况下,无法将Derived**
强制转换为Base**
。基础可能位于对象内的任何位置,这意味着需要更改第一个指针内的值。在你的情况下,该指针是偶数(成为)const
。所以你需要引入一个新变量并分配。
在单继承的可能情况下,我认为由于内存布局保证,reinterpret_cast
会定义行为。绝对值得考虑一下。