Есть такой пример:
class Account {
public:
Account( double d ) { _balance = d; }
/*!!! virtual*/ ~Account(){PrintBalance();}
virtual double GetBalance() { return _balance; }
virtual void PrintBalance() = 0;
private:
double _balance;
};
class CheckingAccount : public Account {
public:
CheckingAccount(double d) : Account(d) {}
void PrintBalance() { cout << "Checking account balance: " << GetBalance() << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
// Create objects of type CheckingAccount and SavingsAccount.
CheckingAccount *pChecking = new CheckingAccount( 100.00 ) ;
// Call PrintBalance using a pointer to Account.
Account *pAccount = pChecking;
pAccount->PrintBalance();
return 0;
}
Такой пример компилируется, линкуется и выполняется. Если же сделать деструктор виртуальным, то при компоновке ошибка (текст из MSVC 9):
VirtualFunctions.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Account::PrintBalance(void)" (?PrintBalance@Account@@UAEXXZ)
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\VirtualFunctions\Debug\VirtualFunctions.exe : fatal error LNK1120: 1 unresolved externals
Пожалуйста, объясните, что не нравится компоновщику.