为什么将Derived **转换为Base * const *禁止?

时间:2010-03-22 00:02:13

标签: c++ pointers casting

在阅读this question之后,我看到Naveen的答案包含指向this页面的链接,基本上说,从Derived **到Base **的转换是禁止的,因为可能会将指针更改为指向Derived1对象的指针指向Derived2对象的指针(如:*derived1PtrPtr=derived2Ptr)。

好的,我明白这是邪恶的......

但是当将Derived**投射到Base*const*时,这甚至都不可能,那么最终是不允许这样做的原因是什么?

2 个答案:

答案 0 :(得分:2)

首先,如果你真的需要,可以将任何指针类型转换为任何其他指针类型。例如,您可以转换为void*作为中间步骤。

其次,通过指针指针,并不是因为没有特殊规则可以使特定案例变得容易,所以没有理由让特定案例变得困难。

基本上,你有一个指向X的指针 - 在你的情况下X碰巧是另一个指针。一些X个案件得到特殊处理(例如派生类可以隐式地转换为基础) - 但是您的X不是其中之一。它不是基类 - 它是一个指针。除了derived**之外,没有为void*定义隐式强制转换 - 您甚至无法隐式地将derived**强制转换为void**

我不认为const在这种情况下与它有很大关系,尽管我可能会遗漏一些东西。

答案 1 :(得分:0)

在多重继承的情况下,无法将Derived**强制转换为Base**。基础可能位于对象内的任何位置,这意味着需要更改第一个指针内的值。在你的情况下,该指针是偶数(成为)const。所以你需要引入一个新变量并分配。

在单继承的可能情况下,我认为由于内存布局保证,reinterpret_cast会定义行为。绝对值得考虑一下。