use*_*404 5 c++ oop polymorphism inheritance
我一直在阅读这个网站上的其他一些主题,他们提到了dynamic_cast和static_cast对于向上转换是否安全.
为什么这些甚至需要升级?
例如,如果B类是从A派生的,那么
A * ptr = new B ();
Run Code Online (Sandbox Code Playgroud)
仍然有效,并且行为类似于A类型的对象.(我也来自Java背景,其中不需要转换转发.
我还在这个网站上读到了downcasting不需要dynamic_cast [问题" 什么时候应该使用static_cast,dynamic_cast,const_cast和reinterpret_cast? "].再一次,我认为只有当你进行向下转换时才能进行转换,因为自动进行向上转换.
我哪里错了?
如果您有复杂的继承层次结构,默认的向上转换行为可能不起作用。例如考虑:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};
Run Code Online (Sandbox Code Playgroud)
在该层次结构中,类型对象D有两个不同的类型基础A。D*从到 的转换A*是不明确的。对于这种类型的情况,您可以强制执行中间步骤
A *p = static_cast<B*>(d); // Give me the 'A' subobject within 'B'
Run Code Online (Sandbox Code Playgroud)
同样,如果有一个函数具有多个重载,可以采用基本类型或派生类型,并且您需要调用采用基本类型的版本(注意:这里有代码味道!),那么您可以使用强制转换来直接重载解析。同样,如果您需要直接重载解析,则您可能做错了其他事情。
除了极端情况(即当默认向上转换不起作用时)之外,实际上没有理由显式使用强制转换操作,而且我实际上建议反对它,因为强制转换应该是一个警告灯,过度使用它们可能会使它们正常而不是正常。阅读代码时发出警报。