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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС C++. 55 Π²Π΅Ρ€Π½Ρ‹Ρ… способов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ структуру ΠΈ ΠΊΠΎΠ΄ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ°ΠΉΠ΅Ρ€Ρ

r.setWidth(r.width() + 10); // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡˆΠΈΡ€ΠΈΠ½Ρƒ r Π½Π° 10

assert(r.height() == oldHeight); // ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ высота r

} // нС измСнилась


Ясно, Ρ‡Ρ‚ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ assert Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒΡΡ. Ѐункция make-Bigger измСняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡˆΠΈΡ€ΠΈΠ½Ρƒ r. Высота остаСтся постоянной.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ посрСдством ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ наслСдования позволяСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΊΠ°ΠΊ частный случай ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°:


class Square: public Rectangle {…};

Square s;

...

assert(s.width() == s.height()); // Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ справСдливо для

// всСх ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ²

makeBigger(s); // ΠΈΠ·-Π·Π° наслСдования, s являСтся

// Rectangle, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ

// ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ

assert(s.width() == s.height()); // По-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ справСдливо

// для всСх ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ²


Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΎ. По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ, ΡˆΠΈΡ€ΠΈΠ½Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Ρ€Π°Π²Π½Π° Π΅Π³ΠΎ высотС.

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ встаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Как ΠΏΡ€ΠΈΠΌΠΈΡ€ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ утвСрТдСния?

β€’ ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ makeBigger высота s Ρ€Π°Π²Π½Π° ΡˆΠΈΡ€ΠΈΠ½Π΅.

β€’ Π’Π½ΡƒΡ‚Ρ€ΠΈ makeBigger ΡˆΠΈΡ€ΠΈΠ½Π° s измСняСтся, Π° высота – Π½Π΅Ρ‚.

β€’ ПослС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· makeBigger высота s снова Ρ€Π°Π²Π½Π° ΡˆΠΈΡ€ΠΈΠ½Π΅ (ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ s пСрСдаСтся ΠΏΠΎ ссылкС, поэтому makeBigger ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ s, Π° Π½Π΅ Π΅Π³ΠΎ копию).

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅?

Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΡ€ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ наслСдования, Π³Π΄Π΅ интуиция, приобрСтСнная Π²Π°ΠΌΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… областях знания, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΡƒ, ΠΈΠ½ΠΎΠ³Π΄Π° оказываСтся ΠΏΠ»ΠΎΡ…ΠΈΠΌ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠΎΠΌ. Основная Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡΡ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ утвСрТдСния, справСдливыС для ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° нСзависимо ΠΎΡ‚ высоты), Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ для ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° (Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ высота Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹). Но ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, β€“ всС! – Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΈ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов. Π’ ситуации с ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°ΠΌΠΈ (Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… случаях, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ мноТСства ΠΈ списки ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π° 38), ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ этого условия Π½Π΅ выполняСтся, поэтому использованиС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ наслСдования для модСлирования здСсь Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, этого Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ, Π½Π΅ сущСствуСт Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ вСсти сСбя Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π›ΡŽΠ±ΠΎΠΌΡƒ программисту Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ извСстно (Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π½Π°ΡŽΡ‚ это Π»ΡƒΡ‡ΡˆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ…): Ссли ΠΊΠΎΠ΄ компилируСтся, Ρ‚ΠΎ это Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

ВсС ΠΆΠ΅ Π½Π΅ стоит Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ приобрСтСнная Π²Π°ΠΌΠΈ Π·Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π³ΠΎΠ΄Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния интуиция окаТСтся бСсполСзной ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. ВсС ваши знания ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ своСму арсСналу наслСдованиС, Π²Π°ΠΌ придСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ свою ΠΈΠ½Ρ‚ΡƒΠΈΡ†ΠΈΡŽ Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прилоТСния с использованиСм наслСдования. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ идСя наслСдования Penguin ΠΎΡ‚ Bird ΠΈΠ»ΠΈ Square ΠΎΡ‚ Rectangle Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π²Π°ΠΌ ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ Π·Π°Π±Π°Π²Π½ΠΎΠΉ, ΠΊΠ°ΠΊ функция объСмом Π² нСсколько страниц. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ это маловСроятно.

ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ «являСтся» – Π½Π΅ СдинствСнноС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ классами. Π”Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ…, достаточно распространСнных ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ – это «содСрТит» ΠΈ Β«Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ посрСдством». Они Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… 38 ΠΈ 39. ΠžΡ‡Π΅Π½ΡŒ часто ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° C++ вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ΄Π΅Ρ‚ Π²ΠΊΡ€ΠΈΠ²ΡŒ ΠΈ вкось ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ эти взаимосвязи ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ «являСтся». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ различия ΠΌΠ΅ΠΆΠ΄Ρƒ этими ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡ… Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² C++.

Π§Ρ‚ΠΎ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

β€’ ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «являСтся». ВсС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ классу, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ Π½Π΅Π³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса являСтся Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 33: НС скрывайтС унаслСдованныС ΠΈΠΌΠ΅Π½Π°

ШСкспир ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»ΡΠ» ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ…. Он писал: Β«Π§Ρ‚ΠΎ Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅Π±Π΅? Π ΠΎΠ·Π° ΠΏΠ°Ρ…Π½Π΅Ρ‚ Ρ€ΠΎΠ·ΠΎΠΉ, Ρ…ΠΎΡ‚ΡŒ Ρ€ΠΎΠ·ΠΎΠΉ Π½Π°Π·ΠΎΠ²ΠΈ Π΅Π΅, Ρ…ΠΎΡ‚ΡŒ Π½Π΅Ρ‚Β». И Π΅Ρ‰Π΅ писал Π±Π°Ρ€Π΄: Β«ΠšΡ‚ΠΎ Π΄ΠΎΠ±Ρ€ΠΎΠ΅ ΠΌΠΎΠ΅ ΠΏΠΎΡ…ΠΈΡ‚ΠΈΡ‚ имя, нСсчастным сдСлаСт мСня вовСк…» ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. И это заставляСт нас ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π·ΠΎΡ€ Π½Π° унаслСдованныС ΠΈΠΌΠ΅Π½Π° Π² C++.

Π’ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ эта Ρ‚Π΅ΠΌΠ° относится Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ наслСдованию, сколько ΠΊ областям видимости. ВсС ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅:


int x; // глобальная пСрСмСнная

void someFunc()

{

double x; // локальная пСрСмСнная

std::cin >> x; // ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x

}


имя x Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ считывания относится ΠΊ локальной, Π° Π½Π΅ ΠΊ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π° Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ области видимости ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ (Β«Π·Π°Ρ‚Π΅Π½ΡΡŽΡ‚Β») ΠΈΠΌΠ΅Π½Π° ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… областСй. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ:

Когда компилятор встрСчаСт имя x Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ someFunc, ΠΎΠ½ смотрит, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π² локальной области видимости. Если Π΄Π°, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰ΠΈΠ΅ области видимости Π½Π΅ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС имя x Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ someFunc ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° double, Π° глобальная пСрСмСнная с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ x ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int, Π½ΠΎ это нСсущСствСнно. ΠŸΡ€Π°Π²ΠΈΠ»Π° сокрытия ΠΈΠΌΠ΅Π½ Π² C++ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для ΠΎΠ΄Π½ΠΎΠΉ-СдинствСнной Ρ†Π΅Π»ΠΈ: ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π°. ΠžΡ‚Π½ΠΎΡΡΡ‚ΡΡ Π»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСмСнная x Ρ‚ΠΈΠΏΠ° double скрываСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ x Ρ‚ΠΈΠΏΠ° int.

ВСрнСмся ΠΊ наслСдованию. ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° находимся Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈ ссылаСмся Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½, typedef ΠΈΠ»ΠΈ Ρ‡Π»Π΅Π½ Π΄Π°Π½Π½Ρ‹Ρ…), компилятор смоТСт Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ссылаСмся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ свойства, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ основан Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π²Π»ΠΎΠΆΠ΅Π½Π° Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. НапримСр:

class Base {

private:

int x;

public:

virtual void mf1() = 0;

virtual void mf2();

void mf3();

...

};

class Derived: public Base {

public:

virtual void mf1()

void mf4();

...

};


Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π° Ρ‡Π»Π΅Π½ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ². Одна ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² – чисто Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ, другая – просто Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ – Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ. Π­Ρ‚ΠΎ я ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ…, Π° Π½Π΅ ΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π― ΠΌΠΎΠ³ Π±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Ρ‰Π΅ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ пСрСчислСний, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… классов ΠΈ typedef. Π’ Π΄Π°Π½Π½ΠΎΠΌ контСкстС Π²Π°ΠΆΠ½ΠΎ лишь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС это ΠΈΠΌΠ΅Π½Π°. Π§Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅Π½ΡƒΡŽΡ‚ – нСсущСствСнно. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ наслСдованиС, Π½ΠΎ, поняв, Ρ‡Ρ‚ΠΎ происходит ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ наслСдовании, Π»Π΅Π³ΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΈ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ C++ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΏΡ€ΠΈ мноТСствСнном наслСдовании.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ функция-Ρ‡Π»Π΅Π½ mf4 Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:


void Derived::mf4()

{

...

mf2();

...

}


Когда компилятор Π²ΠΈΠ΄ΠΈΡ‚ имя mf2, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π½Π° Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ссылаСтся. Для этого Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… областях видимости производится поиск ΠΈΠΌΠ΅Π½ΠΈ mf2. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ΠΎ ищСтся Π² локальной области видимости (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ mf4), Π½ΠΎ Ρ‚Π°ΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅Ρ‚. Π’ΠΎΠ³Π΄Π° просматриваСтся ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости класса Derived. И здСсь Ρ‚Π°ΠΊΠΎΠ΅ имя отсутствуСт, поэтому компилятор ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс. И Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Π°ΠΌ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ mf2, послС Ρ‡Π΅Π³ΠΎ поиск Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Если Π±Ρ‹ mf2 Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΈ Π² классС Base, Ρ‚ΠΎ поиск продолТился Π±Ρ‹ сначала Π² пространствС ΠΈΠΌΠ΅Π½, содСрТащСм Base, Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ΅ имССтся, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² глобальной области видимости.

Π”Π°Π½Π½ΠΎΠ΅ ΠΌΠ½ΠΎΠΉ описаниС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, хотя ΠΈ исчСрпываСт всю ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ процСсса поиска ΠΈΠΌΠ΅Π½ Π² C++. Наша Ρ†Π΅Π»ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ поискС ΠΈΠΌΠ΅Π½ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ компилятор. Достаточно Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ сумССм ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ нСприятных ΡΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠ², Π° для этого ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ.

Π‘Π½ΠΎΠ²Π° вСрнСмся ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mf1 ΠΈ mf3, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²Π΅Ρ€ΡΠΈΡŽ mf3 Π² класс Derived. Как ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π΅ 36, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° mf3 Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Derived (ΠΊΠΎΠ³Π΄Π° наслСдуСтся Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция) сама ΠΏΠΎ сСбС ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Π°, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈΠΌΠ΅Π½, Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ Π½Π° это Π³Π»Π°Π·Π°.

class Base {

private:

int x;

public:

virtual void mf1() = 0;

virtual void mf1(int);

virtual void mf2();

void mf3();

void mf3(double);

...

};

class Derived: public Base {

public:

virtual void mf1()

void mf3();

void mf4();

...

};


Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ повСдСнию, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ любого программиста C++, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠ΅Π³ΠΎΡΡ с Π½ΠΈΠΌ. ОснованноС Π½Π° областях видимости ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ сокрытия ΠΈΠΌΠ΅Π½ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ дСлось, поэтому всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ mf1 ΠΈ mf3 Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС окаТутся скрыты ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ функциями Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния поиска ΠΈΠΌΠ΅Π½, Base::mf1 ΠΈ Base::mf3 Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ классом Derived!