sha*_*oth 8 c++ casting crtp static-cast upcasting
我有一个普通的旧CRPT(请不要因访问限制而分心 - 问题与他们无关):
template<class Derived>
class Base {
void MethodToOverride()
{
// generic stuff here
}
void ProblematicMethod()
{
static_cast<Derived*>(this)->MethodToOverride();
}
};
Run Code Online (Sandbox Code Playgroud)
像往常一样打算像这样使用:
class ConcreteDerived : public Base<ConcreteDerived> {
void MethodToOverride()
{
//custom stuff here, then maybe
Base::MethodToOverride();
}
};
Run Code Online (Sandbox Code Playgroud)
现在static_cast困扰我了.我需要一个向下投射(不是向上投射),所以我必须使用一个明确的演员.在所有合理的情况下,强制转换都是有效的,因为当前对象确实是派生类.
但是如果我以某种方式改变层次结构并且演员现在变得无效呢?
我可以以某种方式强制执行编译时检查,在这种情况下显式向下转换有效吗?
在编译时,您只能检查静态类型,这就是static_cast已经做的事情.
给定a Base*,它只是,并且只能在运行时知道它的动态类型是什么,即它是否实际指向a ConcreteDerived或其他东西.因此,如果要检查它,必须在运行时完成(例如通过使用dynamic_cast)