是否有必要爲虛擬功能定義?虛擬函數是否應該有一個定義?
考慮下面這個示例程序:
#include <iostream>
using namespace std;
class base
{
public:
void virtual virtualfunc();
};
class derived : public base
{
public:
void virtualfunc()
{
cout << "vf in derived class\n";
}
};
int main()
{
derived d;
return 0;
}
這給了鏈接錯誤:
In function
base::base()
:: undefined reference tovtable for base
我沒有在基類中的虛函數的定義。即使我沒有明確調用虛擬函數,爲什麼會發生此錯誤?
我發現有趣的是,如果我沒有實例化類derived
的對象,鏈接錯誤不再存在。爲什麼是這樣?實例化與上面的鏈接錯誤有什麼關係?
重新編輯:如果您沒有實例化一個'derived'或'base',爲什麼鏈接器必須對這兩個類中的任何方法做任何事情?如果這些類沒有被引用,鏈接器沒有理由甚至試圖在對象文件中查找它們。 (除非你正在建立一個圖書館。) – Mat 2011-12-27 08:48:42
@Mat:我同意:) – 2011-12-27 08:55:39