C ++:从一个基类到另一个基类模板的动态转换

时间:2017-12-11 22:04:25

标签: c++ multiple-inheritance dynamic-cast

鉴于以下类结构,我想从struct C<O>中的方法调用struct B中的方法。 C<O>遵循奇怪的重复模板模式。我想这样做而不在struct O中放置方法。在struct O中放置方法会破坏struct C<>的目的。我怀疑这是不可能的,但我想我会问。

编辑: struct O可以是同时包含struct Bstruct C<O>作为基类的一组类型中的任何一种。

struct B
{
    virtual void foo ()
    {
        // dynamic_cast this to C<O>* and call C<O>::moo()
    }
};

template <typename P>
struct C
{
    virtual void moo () { }
};

struct O :
    public B,
    public C<O>
{
};

2 个答案:

答案 0 :(得分:3)

如果按照O的定义定义foo,那么它可以正常工作:

struct B
{
    virtual void foo();
};
template <typename P>
struct C
{

    virtual void moo() {}
};    

struct O :
    public B,
    public C<O>
{
};

void B::foo()
{
    dynamic_cast<C<O>*>(this)->moo();
}

答案 1 :(得分:0)

因此我建议摆脱CRTP并直接从B转换为C.或者至少使C成为非模板类​​并从中派生CRTP。这样,各种O类的多个不重要。

struct C
{
    virtual void moo () {}
};

struct B
{
    virtual void foo ()
    {
        auto p_c{dynamic_cast<C *>(this)};
        if(p_c)
        {
            p_c->moo();
        }
    }
};

struct O: public B, public C
{
};

int main()
{
    O o;
    o.foo();
}