【发布时间】:2012-12-01 09:00:39
【问题描述】:
当我使用静态多态 (CRTP) 时,是否有一种很好的方法可以为多态方法命名?
template <class Derived>
struct Base
{
void interface()
{
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
static void static_func()
{
// ...
Derived::static_sub_func();
// ...
}
};
struct Derived : Base<Derived>
{
void implementation();
static void static_sub_func();
};
因为,据我所知,接口和实现不能有相同的名称(如果它们是虚拟的,它们就会有相同的名称)。如果类层次结构很深,那就有点尴尬了。
也许有一些很好的方法来处理它?还是我错了?
【问题讨论】:
-
为什么接口(实际上是基类)和实现(实际上是派生类)不能同名?
-
我想
virtual关键字是干什么用的。 -
@georgesl 进行 CRTP 时,您这样做是为了避免
virtual函数。 -
接口和实现可以同名。它们不需要是虚拟的,因为它是在编译时解决的。派生类中的 implementation() 将隐藏“base”中的实现。对 Derived 的静态强制转换会导致调用该函数的 Derived 版本。
-
@Pete:虽然他们可以有相同的名字,但这不是一个好主意。意图是
derived.interface()调用基础版本,而后者又调用派生版本;如果它们具有相同的名称,那么将直接调用派生版本。