05.09.2016 Views

Стефан Р. - С++ Для чайников

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. Наследование

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!