class X{
public:
X(void);
// Көшірме конструкторы:
X(const X & r);
};
class Y: public X{
string s;
// Қабаттастырылған объект
public:
// Көшіру конструкторы:
Y(const Y & r): X(r), s(r.s){}
};
Меншіктеу операциясы мұраланбайды, сондықтан ол туынды кластарда
анықталуы тиіс. Мұндайда оның ішінен нақты түрде базалық кластың сəйкес
операциясын шақырған жөн (220 б. қараңыз).
Кластарды мұралау программалаушыға мол мүмкіндіктерді – виртуалды
жəне виртуалды емес базалық кластар, ашық, қорғалған жəне жабық мұралау,
виртуалды əдістер мен басқа да мүмкіндіктерді орындауды қамтамасыз етеді.
Нақты жобаның мақсаттарына барынша сəйкес келетін мүмкіндіктерді таңдау
олардың жұмыс істеу жəне өзара əрекеттесу механизмдерін білуге негізделген.
Х класынан Ү класын ашық түрде мұралау Ү класы Х класының бір түрі
екендігін, яғни нақтыланған дербес концепциясы болып табылатынын
білдіреді. Ү класына қарағанда Х базалық класы айтарлықтай жалпы ұғым
болып табылады
1
. Х класын қолдануға болатын барлық жерлерде Ү класын
да қолдануға болады, бірақ бұл кері бағытта орындалмайды (базалық класқа
сілтемелердің орнына туынды кластардың кез келгеніне сілтеме беруге бо-
латынын еске түсіріңдер). Программаның орындалуы кезінде кластар иерар-
хиясы жəне туынды кластардан базалық кластар объектілеріне хабарламалар
жіберу болмайтындығын есте сақтаған жөн, яғни тек компиляция сатысында
иерархия негізінде өрістері қалыптасатын кластардың нақты объектілері бар
болады.
Құрамында барлық туынды кластары бар, бірақ базалық класс деңгейінде
жүзеге асырыла алмайтын барлық əдістер виртуалды болып табылады.
Мысалы, иерархияның барлық объектілері өздері туралы ақпаратты шығара
1
Мысалы, əрбір программалаушы – ол адам, бірақ əрбір адам программалаушы болмайды.
264
алатындай дəрежеде болуы тиіс. Ол туынды кластардың əртүрлі өрістерінде
сақталатын болғандықтан, бұл функцияны базалық класта жүзеге асыруға
болмайды. Оны барлық кластарда бірдей атпен атау жəне виртуалды функ-
ция ретінде сипаттау керек, осы арқылы базалық кластың басқа əдістері оны
өздері жұмыс істейтін объектінің нақты типіне байланысты шақыра алады.
Осы себептерге байланысты деструкторлар виртуалды болып жарияланады.
Виртуалды əдістерді қайта анықтау кезінде аргументтің келісім бой-
ынша мұраланған мəнін өзгертуге болмайды, себебі С++ ережелері бойынша
ол əдісті шақырған объектінің нақты типі арқылы емес, нұсқауыштың типі
бойынша анықталады:
Достарыңызбен бөлісу: |