派生类双指针到基类双指针的转换:匿名性和安全性
在 C 中,指向派生类的指针可以隐式转换指向其基类的指针,这对于基于继承的编程来说是一个方便的功能。然而,当涉及到双指针时,这种隐式转换会引起一些安全问题。
考虑以下代码:
<code class="cpp">class Base { }; class Child : public Base { }; int main() { // Convert child to base (no problem) Child *c = new Child(); Base *b = c; // Convert double pointer to child to double pointer to base (error) Child **cc = &c; Base **bb = cc; // error: invalid conversion from ‘Child**’ to ‘Base**’ }</code>
GCC 正确地抱怨了最后一个赋值语句,因为从不允许隐式从 Child** 到 Base**。这是由于这些指针的性质存在根本差异:
允许 Child** 隐式转换为 Base** 将违反此区别并引入潜在的安全隐患:
<code class="cpp">// After explicit cast *bb = new Base; // Child pointer now points to a Base!</code>
这可能会导致对象切片,其中子特定的数据将丢失并且完整性受到损害。为了维护类型安全,明确禁止 Child** 和 Base** 之间的转换。
替代转换选项
虽然不支持隐式转换,但还有替代方法允许派生类和基类双指针之间相互转换的转换方法:
总之,派生类双指针和基类双指针之间缺乏隐式转换可以防止潜在的类型安全问题。必要时,请谨慎使用替代转换方法,并考虑使用虚拟析构函数修改类定义以进行动态转换。
以上是C 中派生类双指针可以隐式转换为基类双指针吗?的详细内容。更多信息请关注PHP中文网其他相关文章!