= 0
белгісі жазылады,
мысалы:
virtual void f(int) = 0;
Таза виртуалды əдіс туынды класта қайта анықталуы тиіс (қайтадан таза
виртуалды əдіс ретінде анықталуы мүмкін).
Егер
monstr
класындағы
draw
əдісін
виртуалды əдіс ретінде анықтасақ,
қай кластың əдісін шақыру қажеттігі туралы шешім нұсқауыш сілтеме жасай-
тын объектінің типіне байланысты қабылданатын болады:
monstr *r. *р;
r = new monstr; // monstr класының объектісі құрылады
р = new daemon; // daemon класының объектісі құрылады
r->draw(l, 1, 1, 1); // monstr::draw əдісі шақырылады
p->draw(l, 1, 1, 1); // daemon::draw əдісі шақырылады
р-> monstr::draw(l, 1, 1, 1); // Виртуалды əдістер
// механизмін қолданбау
Егер
daemon
класының объектісі
draw
əдісін тікелей емес, жанама түрде
(яғни,
monstr
класында анықталған басқа əдістен) шақыратын болса, онда
daemon
класының
draw
əдісі шақырылады.
Сонымен, программаның орындалу кезеңінде өзіне сілтеме жасауға рұқсат
етілетін əдіс виртуалды деп аталады (ағылшынның əдемі
virtual
сөзінің
бұл жердегі аудармасының мағынасы – «нақтылы түрде», яғни шақыру нақты
орындалған кезде сілтеме рұқсат етіледі).
Кейінгі байланыстыру механизмі
Ең кем дегенде бір виртуалды əдісі бар əрбір класс (объект емес!) үшін ком-
пилятор виртуалды əдістер кестесін (
vtbl
) құрады, мұнда əрбір виртуалды
əдіс үшін оның компьютер жадындағы адресі жазылады. Кестедегі əдістердің
адрестері олардың кластардағы сипатталу реттілігіне сəйкес орналасады.
Кез келген виртуалды əдістің адресі иерархия құрамындағы əрбір класс үшін
vtbl
кестесінде бірдей ығысуға ие болады.
Достарыңызбен бөлісу: |