Czy konieczne jest posiadanie definicji funkcji wirtualnej?Czy funkcja wirtualna ma zasadniczo definicję?
Rozważmy ten program poniżej próbka:
#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;
}
To daje link-błąd:
In function
base::base()
:: undefined reference tovtable for base
nie mam definicji dla funkcji wirtualnych w klasie bazowej. Dlaczego ten błąd występuje, mimo że nie wywołałem jawnie funkcji wirtualnej?
Interesującą rzeczą, którą odkryłem jest to, że jeśli nie stawiam obiektu klasy derived
, błąd łącza już tam nie występuje. Dlaczego to? Co ma inicjacja z powyższym błędem linku?
Ponowna edycja: jeśli nie tworzysz instancji "pochodnej" lub "bazy", dlaczego linker musi robić cokolwiek z jakąkolwiek metodą z tych dwóch klas? Jeśli klasy nie są przywoływane, linker nie ma powodu, aby próbować wyszukać je w plikach obiektowych. (Chyba, że budujesz bibliotekę.) – Mat
@Mat: Zgadzam się :) –