好奇地反复出现模板模式和虚拟继承

时间:2014-05-30 11:54:22

标签: c++ templates inheritance crtp static-polymorphism

我正在使用curiously recurring template pattern to model static polymorphism

这非常正常,直到有人引入virtual inheritance(以解决diamond problem)。

然后编译器(Visual Studio 2013)开始抱怨

error C2635: cannot convert a 'Base*' to a 'Derived*'; conversion from a virtual base class is implied

基本上,此转化为not allowed

为什么? static_castc-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();
}

1 个答案:

答案 0 :(得分:2)

根据我的发现,这些不能合并。

curiously recurring template pattern的要点是在编译时解析调用。

正如T.C.所指出的那样。在评论中,virtual inheritance无法在运行时解决。

这意味着两个人不要混在一起,而且必须给予。