C++ 具有模板接口的多重继承
考虑以下代码: 模板.hC++ 具有模板接口的多重继承,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>
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并实现这三个函数
对于此代码,编译器为我提供以下消息:
通常,代码的思想是实现双类型分派。虽然我认为我知道问题的起因,但我不知道如何解决它。也许你能帮我 我有点困惑你的意图是什么 但是关于:
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);
}