带模板接口的多继承

时间:2015-07-03 18:54:49

标签: c++ templates multiple-inheritance

请考虑以下代码:

template.h

template<typename T>
class templ{
public:
    virtual const int virtualMethod(const T *const) const = 0;
}

Base.h

#include "template.h"

class Der1;
class Der2;

    class Base :
        public templ<Base>,
        public templ<Der1>,
        public templ<Der2>{
    public:
        virtual ~Base(){}
    };

Der1.h

#include "Base.h"

class Der1 : public Base {
public:
    virtual const int virtualMethod(const Base *const) const override;
    virtual const int virtualMethod(const Der1 *const) const override;
    virtual const int virtualMethod(const Der2 *const) const override;
};

Der1.cpp

#include "Der1.h"

const int Der1::virtualMethod(const Base *const sth) const{
    return sth->templ<Der1>::virtualMethod(this);//does not work
    //how to fix it?
}

const int Der1::virtualMethod(const Der1 *const sth) const{
    //do sth
}

const int Der1::virtualMethod(const Der2 *const sth) const{
    //do sth
}

Der2类也继承自Base并实现这三个功能。

对于这段代码,编译器会给我这些消息:

  1. &#39; TEMPL&#39;是模糊的&#39;候选人是:templ()templ(const templ&amp;)templ()templ(const templ&amp;)templ() templ(const templ&amp;)&#39;
  2. 功能&#39; virtualMethod&#39;无法解决
  3. 命名空间成员函数&#39; virtualMethod&#39;无法解决。
  4. Type&#39; Der1&#39;无法解决。
  5. 未定义的引用 `templ :: virtualMethod(Der1 const *)const&#39;
  6. 一般来说,代码的想法是实现双类型调度。虽然我想我知道是什么原因引起了问题,但我不知道如何解决它。也许你可以帮助我。

1 个答案:

答案 0 :(得分:0)

我有点困惑你的意图是什么......

但是怎么样:

const int Der1::virtualMethod(const Base *sth) const { 
     return dynamic_cast<const templ<Der1> *>(sth)->virtualMethod(this);
}