[英]Why does implementation of abstract class not see overloaded pure virtual function?
[英]Linker does not see template function defined in a base (pure virtual) class
這是代碼:
class PureDummy
{
public:
virtual void foo() = 0;
template<class T>
void bar();
};
class Dummy : public PureDummy
{
public:
virtual void foo()
{
}
template<class T>
void bar()
{
}
};
int main(int argc, char **argv)
{
PureDummy *pdummy = new Dummy();
pdummy->foo(); //OK
//pdummy->bar<int>(); //undefined reference to `void PureDummy::bar<int>()'
}
因此,正如評論所指出的,調用bar編譯失敗。
為什么模板函數表現出與“常規” foo函數不同的行為?
是否可以“指出”派生類中有一個實現?
pdummy
的靜態類型是PureDummy *
因此編譯器將首先在PureDummy
類中檢查此類功能。 一個存在並且可以訪問,因此它將嘗試呼叫。 該函數是非虛擬的(模板不能是虛擬的),因此它將嘗試調用PureDummy::bar
。 該函數沒有定義,因此鏈接失敗並出現未定義的符號錯誤。
您正在調用PureDUmmy::bar
,但尚未提供其定義。
實際的結果是鏈接錯誤。
為了能夠在派生類中為運行時多態重寫一個函數(顯然,您正在嘗試通過指向基類的指針進行調用),它必須是virtual
。 C ++不支持virtual
函數的模板化。 在某些情況下適用的一種可行解決方案是將運行時多態替換為編譯時多態,並使用CRTP。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.