Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 208

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ объявлСниС using Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Π΅Ρ… ΠΈΠΌΠ΅Π½, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½.

Π£Ρ€ΠΎΠ²Π½ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ наслСдования ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.2 ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ классов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов struct, ΠΈ class Ρ€Π°Π·Π½Ρ‹Π΅ спСцификаторы доступа ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ спСцификатор наслСдования зависит ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом class, Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС (private inheritance), Π° с ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом struct β€” ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ (public inheritance):

class Base { /* ... */ };

struct D1 : Base { /* ... */ }; // ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

class D2 : Base { /* ... */ };  // Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’Π΅ΡΡŒΠΌΠ° распространСнно Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ классами ΠΈ структурами Π΅ΡΡ‚ΡŒ ΠΈΠ½Ρ‹Π΅, Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠ΅ различия. ЕдинствСнноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ β€” Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ спСцификаторы доступа для Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ наслСдования. Никаких Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Π½Π΅Ρ‚.

Для Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ наслСдования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ явно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ private, Π½Π΅ слСдуСт ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ ясно Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ, Π° Π½Π΅ ΠΏΠΎ ΠΎΠΏΠ»ΠΎΡˆΠ½ΠΎΡΡ‚ΠΈ.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 15.5

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.18. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ классов Base ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Π½Π΅Π³ΠΎ, ΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² коммСнтариях, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… присвоСний допустимы. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ нСдопустимыС.

Base *p = &d1; // d1 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Pub_Derv

p = &d2;       // d2 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Priv_Derv

p = &d3;       // d3 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Prot_Derv

p = &dd1;      // dd1 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Derived_from_Public

p = &dd2;      // dd2 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Derived_from_Private

p = &dd3;      // dd3 ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Derived_from_Protected

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.19. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· классов: Base ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ Π½Π΅Π³ΠΎ, Π΅ΡΡ‚ΡŒ функция-Ρ‡Π»Π΅Π½ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

void memfcn(Base &b) { b = *this; }

Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅, Π±Ρ‹Π»Π° Π»ΠΈ эта функция допустима для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.20. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π΄Π²Π° упраТнСния.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.21. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΡ… абстракций, содСрТащих сСмСйство Ρ‚ΠΈΠΏΠΎΠ² (ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ). ΠžΡ€Π³Π°Π½ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΈΠΏΡ‹ Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ наслСдования.

(a) Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ графичСских Ρ„Π°ΠΉΠ»ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: gif, tiff, jpeg, bmp)

(b) Π“СомСтричСскиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: box, circle, sphere, cone)

(c) Π’ΠΈΠΏΡ‹ языка Π‘++ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: class, function, member function)

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.22. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΈΠΌΠ΅Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ вСроятных Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² для класса, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ.

15.6. ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости класса ΠΏΡ€ΠΈ наслСдовании

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс опрСдСляСт ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости (scope) (см. Ρ€Π°Π·Π΄Π΅Π» 7.4), Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Ρ‹. ΠŸΡ€ΠΈ наслСдовании ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса (см. Ρ€Π°Π·Π΄Π΅Π» 2.2.4) вкладываСтся Π² области видимости Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Если имя Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² области видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, поиск Π΅Π³ΠΎ опрСдСлСния продолТаСтся Π² областях видимости Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов.

Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π²Π»ΠΎΠΆΠ΅Π½Π° Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»Π΅Π½. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… частях тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Но ΠΈΠΌΠ΅Π½Π½ΠΎ это иСрархичСскоС Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ областСй видимости класса позволяСт Ρ‡Π»Π΅Π½Π°ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π»Π΅Π½Ρ‹ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Bulk_quote bulk;

cout << bulk.isbn();

Π’ этом ΠΊΠΎΠ΄Π΅ поиск опрСдСлСния ΠΈΠΌΠ΅Π½ΠΈ isbn() осущСствляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

β€’ ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вызываСтся функция isbn() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° Bulk_quote, поиск начинаСтся Π² классС Bulk_quote. Π’ этом классС имя isbn() Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ.

β€’ ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс Bulk_quote происходит ΠΎΡ‚ класса Disc_quote, Π² Π½Π΅ΠΌ ΠΈ продолТаСтся поиск. Имя всС Π΅Ρ‰Π΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ.

β€’ ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс Disc_quote происходит ΠΎΡ‚ класса Quote, поиск продолТаСтся Π² Π½Π΅ΠΌ. Π’ этом классС находится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ isbn(); Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹Π·ΠΎΠ² isbn() распознаСтся ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ isbn() класса Quote.

Поиск ΠΈΠΌΠ΅Π½ осущСствляСтся Π²ΠΎ врСмя компиляции

БтатичСский Ρ‚ΠΈΠΏ (см. Ρ€Π°Π·Π΄Π΅Π» 15.2.3) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ссылки ΠΈΠ»ΠΈ указатСля опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄ΠΈΠΌΡ‹. Π”Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° статичСский ΠΈ динамичСский Ρ‚ΠΈΠΏΡ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ (это Π±Ρ‹Π²Π°Π΅Ρ‚ Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ссылка ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс), ΠΈΠΌΠ΅Π½Π½ΠΎ статичСский Ρ‚ΠΈΠΏ опрСдСляСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹. НапримСр, Π² класс Disc_quote ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Ρ€Ρƒ (Ρ‚ΠΈΠΏ pair) (см. Ρ€Π°Π·Π΄Π΅Π» 11.2.3), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ минимальноС (ΠΈΠ»ΠΈ максимальноС) количСство ΠΈ Ρ†Π΅Π½Ρƒ со скидкой.

class Disc_quote : public Quote {

public:

 std::pair<size_t, double> discount_policy() const

 { return {quantity, discount}; }

 // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‡Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΆΠ΄Π΅

};

Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ discount_policy() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈΠ»ΠΈ ссылку Π½Π° Ρ‚ΠΈΠΏ Disc_quote, ΠΈΠ»ΠΈ класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π½Π΅Π³ΠΎ:

Bulk_quote bulk;

Bulk_quote *bulkP = &bulk; // статичСский ΠΈ динамичСский Ρ‚ΠΈΠΏΡ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚

Quote *itemP = &bulk; // статичСский ΠΈ динамичСский Ρ‚ΠΈΠΏΡ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ

bulkP->discount_policy();  // ok: bulkP ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Bulk_quote*

itemP->discount_policy();  // ошибка: itemP ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Quote*

Π₯отя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ bulk ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ discount_policy(), ΠΎΠ½Π° нСдоступна Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ itemP. Π’ΠΈΠΏ itemP β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ Quote, Π° это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ поиск ΠΈΠΌΠ΅Π½ΠΈ discount_policy() начнСтся Π² классС Quote. Π£ класса Quote Π½Π΅Ρ‚ Ρ‡Π»Π΅Π½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ discount_policy(), поэтому Π²Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ссылки ΠΈΠ»ΠΈ указатСля Π½Π° Ρ‚ΠΈΠΏ Quote Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½.

ΠšΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΠΈΠΌΠ΅Π½ ΠΈ наслСдованиС

Как ΠΈ любая другая, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса позволяСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² Π΅Π³ΠΎ прямом ΠΈΠ»ΠΈ косвСнном Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΈΠΌΠ΅Π½Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ области видимости (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС), ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΠΈΠΌΠ΅Π½Π° Π²ΠΎ внСшнСй области видимости (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС) (см. Ρ€Π°Π·Π΄Π΅Π» 2.2.4):

struct Base {

 Base() : mem(0) { }

protected:

 int mem;

};

struct Derived : Base {

 Derived(int i): mem(i) { } // Derived::mem инициализируСтся i

                            // Base::mem инициализируСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

 int get_mem() { return mem; } // Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Derived::mem

protected:

 int mem; // скрываСт mem Π² Base

};

Бсылка Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ mem Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ get_mem() распознаСтся ΠΊΠ°ΠΊ имя Π² классС Derived. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄

Derived d(42);

cout << d.get_mem() << endl; // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 42

Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 42.

Π§Π»Π΅Π½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‡Π»Π΅Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, скрываСт Ρ‡Π»Π΅Π½ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ прямой доступ ΠΊ Π½Π΅ΠΌΡƒ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° области видимости для доступа ΠΊ скрытым Ρ‡Π»Π΅Π½Π°ΠΌ

Для доступа ΠΊ скрытому Ρ‡Π»Π΅Π½Ρƒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости.

struct Derived : Base {

 int get_base_mem() { return Base::mem; }

};

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ области видимости измСняСт Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ порядок поиска ΠΈ заставляСт компилятор Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ поиск ΠΈΠΌΠ΅Π½ΠΈ mem с класса Base. Если Π±Ρ‹ ΠΊΠΎΠ΄ Π²Ρ‹ΡˆΠ΅ Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ с этой вСрсиСй класса Derived, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π° d.get_mem() Π±Ρ‹Π» Π±Ρ‹ 0.

ΠšΡ€ΠΎΠΌΠ΅ пСрСопрСдСлСния унаслСдованных Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС.

ΠšΠ»ΡŽΡ‡Π΅Π²Π°Ρ концСпция. Поиск ΠΈΠΌΠ΅Π½ΠΈ ΠΈ наслСдованиС

Для понимания наслСдования Π² языкС Π‘++ ΠΊΡ€Π°ΠΉΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ распознавания Π²Ρ‹Π·ΠΎΠ²Π° p->mem() (ΠΈΠ»ΠΈ obj.mem()) ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ этапа.

β€’ Π‘Π½Π°Ρ‡Π°Π»Π° опрСдСляСтся статичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° p (ΠΈΠ»ΠΈ obj). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π²Ρ‹Π·ΠΎΠ² Ρ‡Π»Π΅Π½Π° класса, Ρ‚ΠΈΠΏ Π±ΡƒΠ΄Π΅Ρ‚ классом.

β€’ ΠŸΠΎΠΈΡΠΊ ΠΈΠΌΠ΅Π½ΠΈ mem осущСствляСтся Π² классС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт статичСскому Ρ‚ΠΈΠΏΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° p (ΠΈΠ»ΠΈ obj). Если функция mem() Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°, поиск продолТаСтся Π² прямом Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС ΠΈ Π΄Π°Π»Π΅Π΅ ΠΏΠΎ Ρ†Π΅ΠΏΠΈ классов, ΠΏΠΎΠΊΠ° имя mem Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ осмотрСн послСдний класс. Если функция mem() Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° Π½ΠΈ Π² самом классС, Π½ΠΈ Π² Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах, Π²Ρ‹Π·ΠΎΠ² ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.