免责声明
以下是为了使事情易于理解而挥手致意,而不是技术上正确的描述。
挥手的
一种可能的引入方式void
是:
void
与Java通用超类相似(不一样) 。Object
void
可以看作是每个类和非类类型的抽象基。(使用这个比喻,void
也将是一个准虚拟基类型:转换void*
为永远不会模棱两可。)
因此,您可以将隐式转换从T*
tovoid*
视为派生到基的转换,而反过来static_cast
就像派生向下转换的基。当 avoid*
没有真正指向 aT
时,你不应该做 a static_cast<T*>
(当 aBase*
没有真正指向 aDerived
时,你不应该做 a static_cast<Derived*>
)。
免责声明,再次
严重的是, void
它不是一个抽象基类,并且在许多情况下不能被正式视为一个:
- 您不能正式将其描述
void
为虚拟基(或static_cast
会中断)或非虚拟基(或void*
在使用多重继承时转换为模棱两可)。
- 没有
void&
类型。这个基类隐喻确实超出了指针。
请不要告诉人们“void
是通用的 C++ 基类,如 Java 对象”。如果没有完整的免责声明,请勿重复我在这里写的任何内容。
仅在某些情况下, void
出于指针隐式转换和强制转换的目的,它的行为类似于基类。
您不能基于隐喻编写程序,而是基于真正的 C++ 规则编写程序。
这个比喻可能会有所帮助。或不。无论哪种方式,都不要试图根据隐喻得出合乎逻辑的结论。