c++ - 从派生**转换为基础**

标签 c++ inheritance pointers c++-faq pointer-conversion

我正在阅读 this不幸的是,无法深入理解为什么编译器不允许从 Derived** 转换为 Base**。我也看过this它只提供了 parashift.com 链接的更多信息。

编辑:

让我们逐行分析这段代码:

   Car   car;
   Car*  carPtr = &car;
   Car** carPtrPtr = &carPtr;
   //MyComment: Until now there is no problem!

   Vehicle** vehiclePtrPtr = carPtrPtr;  // This is an error in C++
   //MyComment: Here compiler gives me an error! And I try to understand why. 
   //MyComment: Let us consider that it was allowed. So what?? Let's go ahead!

   NuclearSubmarine  sub;
   NuclearSubmarine* subPtr = ⊂
   //MyComment: this two line are OK too!

   *vehiclePtrPtr = subPtr;

   //MyComment: the important part comes here... *vehiclePtrPtr is a pointer to
   //MyComment: a vehicle, particularly in our case it points to a Car object.
   //MyComment: Now when I assign to the pointer to the Car object *vehiclePtrPtr,
   //MyComment: a pointer to NuclearSubmarine, then it should just point to the
   //MyComment: NuclearSubmarine object as it is indeed a pointer to a Vehicle,
   //MyComment: isn't it? Where is my fault? Where I am wrong?

   // This last line would have caused carPtr to point to sub!
   carPtr->openGasCap();  // This might call fireNuclearMissle()!

最佳答案

一碗香蕉不是一碗水果的原因基本相同。如果一碗香蕉一碗水果,你可以把一个苹果放进碗里,它就不再是一碗香蕉了。

只要您只检查碗,转换是无害的。但是一旦你开始修改它,转换就变得不安全了。这是要牢记的关键点。 (这就是为什么不可变 Scala 集合实际上允许转换,但可变集合禁止转换的确切原因。)

与您的示例相同。如果有从 Derived**Base** 的转换,您可以放置​​一个指向苹果的指针,而类型系统 promise 只存在指向香蕉的指针。轰隆隆!

关于c++ - 从派生**转换为基础**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8026040/

相关文章:

c++ - 计算边界框的面积

c++ - 如何创建特殊词

C# - 基类中的调用方法

c - 为什么我在这个程序中遇到段错误?

c - 为什么输出反转且第一个字符丢失?

c++ - gtest 编译期间的 Cmake 错误 - gtest/internal/gtest-type-util.h :732:25: error: expected type-specifier

c++ - 判断文件是否是 FTP 服务器上的目录

Java 将 <object> 列表转换到它的接口(interface)

c++ - 如何使基类的某些构造函数只能由特定的派生类调用?

C : Working with structures and pointers , 错误:一元 ‘*’ 的无效类型参数