Виртуальный деструктор вызывает абстрактный метод
От: AkaSaint  
Дата: 27.08.08 08:38
Оценка:
Есть такой пример:
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

Пожалуйста, объясните, что не нравится компоновщику.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.