我正在使用奇怪重复的模板模式来模拟静态多态性。
这工作得很好,直到有人介绍virtual inheritance
(解决 a diamond problem
)。
然后编译器(Visual Studio 2013)开始抱怨
error C2635: cannot convert a 'Base*' to a 'Derived*'; conversion from a virtual base class is implied
基本上,这种转换是不允许的。
这是为什么?两者都static_cast
失败c-style cast
。
有没有不放弃其中一个的解决方案?
编辑:
这是一个示例(删除虚拟并且它可以工作):
template <class Derived>
struct Base
{
void interface()
{
static_cast<Derived*>(this)->implementation();
}
};
struct Derived : virtual Base<Derived>
{
void implementation() { std::cout << "hello"; }
};
int main()
{
Derived d;
d.interface();
}