Объектно-ориентированное программирование на С++ - eDrive
Объектно-ориентированное программирование на С++ - eDrive
Объектно-ориентированное программирование на С++ - eDrive
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
117<br />
Виртуальные функции и абстрактные классы<br />
При обычном <strong>на</strong>следовании объект производного класса обладает<br />
свойствами и поведением объектов базового класса. В этом случае говорят о<br />
раннем, или статическом, связывании <strong>на</strong> стадии компиляции. Виртуальными<br />
(virtual function) <strong>на</strong>зываются функции, которые определяются <strong>на</strong> стадии исполнения,<br />
то есть производится их позднее, или ди<strong>на</strong>мическое, связывание.<br />
Для этого объект производного класса с<strong>на</strong>бжается скрытым указателем <strong>на</strong><br />
базовый класс, который используется компилятором <strong>на</strong> стадии выполнения<br />
программы.<br />
При объявлении виртуальной функции к ее имени добавляется лексема<br />
virtual, что позволяет производным классам при необходимости переопределять<br />
такую функцию без изменения ее имени в списке параметров:<br />
virtual Тип имяФункции ([ объявлениеПараметров ]);<br />
«Виpтуальные функции служат центpальным моментом объектноориентированного<br />
программирования, потому что они позволяют опpеделять<br />
базовый класс общего <strong>на</strong>з<strong>на</strong>чения, не тpебуя з<strong>на</strong>ния особенностей, котоpые<br />
могут быть пpедусмотpены пpоизводным классом. Пpогpамма <strong>на</strong> C++ без<br />
виpтуальных функций, веpоятно, пpосто невеpно спpоектиpова<strong>на</strong>» [5]. Иными<br />
словами, виpтуальные функции опpеделяют возможности, котоpыми обладают<br />
пpоизводные классы, но котоpые не могут быть pеализованы <strong>на</strong><br />
уpовне базового класса.<br />
class VMarket {<br />
public:<br />
virtual void Market1 () { ShowMessage ("Телевизоры"); }<br />
void Market2 () { ShowMessage ("Компьютеры"); }<br />
};<br />
class VSection: public VMarket {<br />
public:<br />
void Market1 () { ShowMessage ("SONY"); }<br />
void Market2 () { ShowMessage ("MACINTOSH"); }<br />
};<br />
void MainVirtual1 () {<br />
VMarket *m = new VSection; // ссылка <strong>на</strong> производный класс<br />
m–>Market1 ();<br />
// SONY<br />
m–>Market2 ();<br />
// Компьютеры<br />
}