问题来源:
此问题来源于muduo库代码的学习过程中,在muduo/base/Types.h文件中的第62行,如图:
后续代码:
这段话是说,使用implicit_cast
作为static_cast
和const_cast
的安全版本。
看到第112行,我有了一个疑惑:
static_cast
也会进行类型检查,为什么要自定义一个隐式转换,而不是直接使用static_cast
呢?
这段注释说implicit_cast
比static_cast
安全,更安全体现在哪里呢?
解决
还是试一下吧,有如下的测试代码:
template<typename To, typename From>
inline To implicit_cast(From const &f)
{
return f;
}
class A {};
class B : public A {};
class C {};
int main() {
A a;
A* p1 = &a;
B b;
B* p2 = &b;
A* p3 = &b;
//基类指针转子类指针
implicit_cast<B*>(p1);//不通过
static_cast<B*>(p1);//通过
//子类指针转基类指针
implicit_cast<A*>(p2);//通过
static_cast<A*>(p2);//通过
//指向子类对象的基类指针转子类指针
implicit_cast<B*>(p3);//不通过
static_cast<B*>(p3);//通过
//不相干类型的指针转换
implicit_cast<C*>(p1);//不通过
static_cast<C*>(p1);//不通过
//试图去除底层const属性
const B* p4 = &b;
implicit_cast<A*>(p4);//不通过
static_cast<A*>(p4);//不通过
return 0;
}
总结
从编译结果可以看出,二者都会进行类型检查,禁止不相关的类型转换以及试图去除const的转换。
但static_cast
允许向上、向下转型,而implicit_cast
只允许向下转型。
所以说在这种情况下,使用implicit_cast
更合适。
尽管有时候想要用指向子类对象的基类指针向下转型,但static_cast
和implicit_cast
都只判断其静态类型,如果有这个需求,那就使用把static_cast包装后的down_cast
。
为什么不使用dynamic_cast?1. 有额外开销;2. 尽量用static_cast作为替代。由于多继承的存在,有些情况无法避免使用dynamic_cast。
2020/04/02 19:46