13.01.2015 Views

Объектно-ориентированное программирование на С++ - eDrive

Объектно-ориентированное программирование на С++ - eDrive

Объектно-ориентированное программирование на С++ - eDrive

SHOW MORE
SHOW LESS

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 />

}

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

Saved successfully!

Ooh no, something went wrong!