【发布时间】:2011-05-06 06:41:44
【问题描述】:
我有一个普通的旧 CRPT(请不要被访问限制分心 - 问题不在于它们):
template<class Derived>
class Base {
void MethodToOverride()
{
// generic stuff here
}
void ProblematicMethod()
{
static_cast<Derived*>(this)->MethodToOverride();
}
};
像往常一样打算这样使用:
class ConcreteDerived : public Base<ConcreteDerived> {
void MethodToOverride()
{
//custom stuff here, then maybe
Base::MethodToOverride();
}
};
现在static_cast 困扰着我。我需要一个向下转换(不是向上转换),所以我必须使用显式转换。在所有合理的情况下,转换都是有效的,因为当前对象确实属于派生类。
但是,如果我以某种方式更改了层次结构并且演员现在变得无效怎么办?
我可以以某种方式强制编译时检查显式向下转换在这种情况下是否有效?
【问题讨论】:
-
Base 类中不需要 MethodToOverride。
-
@ysdx:如果我希望它可以选择性地被覆盖或有一些常见的实现,我需要它。
-
但是如果你在基类中有这个函数,这个调用将永远“工作”,因为有有一个函数可以调用。
-
@Bo Persson:是的,这就是为什么我需要向下转换来调用最衍生的函数,并且如果需要,最衍生的函数可以调用基本版本。
-
你不考虑使用虚函数吗? :-)
标签: c++ casting crtp static-cast upcasting