You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
pAcc->withdrawal(100.OOf);<br />
//этот вызов недопустим,<br />
//поскольку withdrawal()<br />
//не является членом класса Account<br />
int main f)<br />
!<br />
Savings s; //открыть счет<br />
fnf&s);<br />
//продолжение программы<br />
}<br />
Представьте себе, что вы открываете сберегательный счет s. Затем вы передаете<br />
адрес этого счета функции f n (}, которая пытается выполнить функцию<br />
withdrawal (). Однако, поскольку функция withdrawal () не член класса Account,<br />
компилятор сгенерирует сообщение об ошибке.<br />
Некоторые языки выполняют такую проверку, когда функция уже вызвана, во<br />
время выполнения программы. В таком случае приведенный выше фрагмент кода будет<br />
работать: raain() будет вызывать f n () и передавать ей объект s. Когда fnf),<br />
в свою очередь, вызовет функцию withdrawal (), программа увидит, что<br />
withdrawal!) действительно определена в переданном ей объекте. Цена такой гибкости<br />
— снижение скорости выполнения программы, поскольку язык должен проводить<br />
множество проверок во время ее выполнения. Это также чревато некоторыми<br />
ошибками. Например, если кто-то передаст объект, который является счетом, но не<br />
содержит определенной в нем функции withdrawal О, то программа аварийно прекратит<br />
работу, так как не сможет определить, что делать с этим вызовом. Я думаю,<br />
пользователи будут не очень рады этому.<br />
Взгляните, как чисто виртуальная функция помогает решить эту проблему. Вот та<br />
же ситуация с абстрактным классом Account:<br />
class Account<br />
{<br />
//почти то же, что и в предыдущей программе,<br />
//однако функция withdrawal() определена<br />
virtual void withdrawal(float amnt) = 0;<br />
};<br />
class Savings : public Account<br />
{<br />
public:<br />
virtual void withdrawal(float amnt);<br />
};<br />
void fn(Account *pAcc)<br />
i<br />
//снять некоторую сумму<br />
//теперь этот код будет работать<br />
pAcc->withdrawal(100.OOf);<br />
int main()<br />
{<br />
Savings s; //открыть счет<br />
fn(&s);<br />
//продолжение программы<br />
252 Часть IV. Наследование