Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有模板接口的多重继承_C++_Templates_Multiple Inheritance - Fatal编程技术网

C++ 具有模板接口的多重继承

C++ 具有模板接口的多重继承,c++,templates,multiple-inheritance,C++,Templates,Multiple Inheritance,考虑以下代码: 模板.h template<typename T> class templ{ public: virtual const int virtualMethod(const T *const) const = 0; } Der1.cpp #include "Der1.h" const int Der1::virtualMethod(const Base *const sth) const{ return sth->templ<Der1>

考虑以下代码:

模板.h

template<typename T>
class templ{
public:
    virtual const int virtualMethod(const T *const) const = 0;
}
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
}
#包括“Der1.h”
const int Der1::虚拟方法(const Base*const sth)const{
return sth->temp::virtualMethod(this);//不起作用
//如何修复它?
}
const int Der1::虚拟方法(const Der1*const sth)const{
//做某事
}
const int Der1::虚拟方法(const Der2*const sth)const{
//做某事
}
类Der2还继承自Base并实现这三个函数

对于此代码,编译器为我提供以下消息:

  • “templ”是不明确的“候选项是:temp()temp(const temp&)temp()temp(const temp&)temp() 模板(const temp&)'
  • 无法解析函数“virtualMethod”
  • 无法解析命名空间成员函数“virtualMethod”
  • 无法解析类型“Der1”
  • 未定义的引用 `templ::virtualMethod(Der1 const*)const'

  • 通常,代码的思想是实现双类型分派。虽然我认为我知道问题的起因,但我不知道如何解决它。也许你能帮我

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

    但是关于:

    const int Der1::virtualMethod(const Base *sth) const { 
         return dynamic_cast<const templ<Der1> *>(sth)->virtualMethod(this);
    }
    
    const int Der1::virtualMethod(const Base*sth)const{
    返回动态(sth)->虚拟方法(this);
    }
    
    您可能希望使用而不是嵌入式抽象基类。除非您知道自己在做什么,否则请不要将静态多态性(模板)和动态多态性(虚拟)混合使用。此外,在定义接口时,您应该使用虚拟继承(避免多个基类)可以发布吗?你的代码编译得很好,除非你缺少include或其他东西。这绝对不是我想要的。我编写的代码的主要目的是避免动态_cast和RTTI。不要提及你的代码是危险的,因为没有检查
    nullptr
    的动态强制转换结果。当然,你应该检查强制转换结果,但我忽略了这一点,因为这不是大多数解决方案,我认为在这种情况下,它不是必需的,因为强制转换总是积极的(除非sth=nullptr,它也没有在你的代码中检查).
    #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
    }
    
    const int Der1::virtualMethod(const Base *sth) const { 
         return dynamic_cast<const templ<Der1> *>(sth)->virtualMethod(this);
    }