考慮下面的代碼段:多繼承與模板接口
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繼承並實現了這三個函數。
對於這個代碼編譯器給我這些消息:
- 'TEMPL' 不明確「候選人有:TEMPL()TEMPL(常量 TEMPL &)TEMPL()TEMPL(常量TEMPL &)TEMPL() TEMPL(常量TEMPL &)'
- 函數 'virtualMethod' 不能被解析
- 命名空間的成員函數 'virtualMethod' 不能被解決。
- 類型'Der1'無法解析。
- 未定義參考 `TEMPL :: virtualMethod(Der1常量*)常量」
一般情況下,代碼的想法是實現double類型調度。雖然我認爲我知道是什麼原因造成問題,但我不知道如何解決問題。所以,也許你可以幫助我。
你可能想用[CRTP(https://en.wikipedia.org/ wiki/Curiously_recurring_template_pattern)而不是嵌入式抽象基類。 –
請不要混合靜態多態(模板)和動態多態(虛擬),除非你知道你在做什麼。 –
此外,在定義接口時,您應該使用虛擬繼承(避免多個基類) –