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

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

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

β€’ ΠŸΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‡Π»Π΅Π½ класса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдоступСн ΠΈΠ· Π·Π° спСцификатора управлСния доступом. Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ рассматриваСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.5.

Π₯отя автоматичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ указатСлям ΠΈ ссылкам, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ классов Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ наслСдования (явно ΠΈΠ»ΠΈ нСявно) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (см. Π³Π»Π°Π²Ρƒ 13). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ. Однако ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ присвоСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΠ»ΠΈ присваиваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π»Π΅Π½Ρ‹ части Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.8. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ статичСский ΠΈ динамичСский Ρ‚ΠΈΠΏΡ‹.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.9. Когда ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ статичСского Ρ‚ΠΈΠΏΠ° выраТСния ΠΎΡ‚ Π΅Π³ΠΎ динамичСского Ρ‚ΠΈΠΏΠ°? ΠŸΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… статичСский ΠΈ динамичСский Ρ‚ΠΈΠΏΡ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.10. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 8.1, ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 8.2.1, Π³Π΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read() класса Sales_data пСрСдавался ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ifstream.

15.3. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, Π² языкС Π‘++ динамичСскоС связываниС происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° Ρ‡Π΅Ρ€Π΅Π· ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (см. Ρ€Π°Π·Π΄Π΅Π» 15.1). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния нСизвСстно, какая вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вызываСтся, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ всСгда. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли функция Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (см. Ρ€Π°Π·Π΄Π΅Π» 6.1.2). Однако слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΎΠ½Π° использована, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ компилятора Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция.

Π’Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ распознаны Π²ΠΎ врСмя выполнСния

Когда Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция вызываСтся Ρ‡Π΅Ρ€Π΅Π· ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, компилятор создаСт ΠΊΠΎΠ΄ распознавания Π²ΠΎ врСмя выполнСния (decide at run time) Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВызываСтся Ρ‚Π° функция, которая соотвСтствуСт динамичСскому Ρ‚ΠΈΠΏΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, связанного с этим ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈΠ»ΠΈ ссылкой.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ print_total() ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 15.1. Она Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ net_price() своСго ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° item Ρ‚ΠΈΠΏΠ° Quote&. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ item β€” это ссылка ΠΈ функция net_price() являСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ, какая ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· Π΅Π΅ вСрсий Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Π²ΠΎ врСмя выполнСния, зависит ΠΎΡ‚ фактичСского (динамичСского) Ρ‚ΠΈΠΏΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, связанного с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ item:

Quote base("0-201-82470-1", 50);

print_total(cout, base, 10);   // Π²Ρ‹Π·ΠΎΠ² Quote::net_price()

Bulk_quote derived("0-201-82470-1", 50, 5, .19);

print_total(cout, derived, 10); // Π²Ρ‹Π·ΠΎΠ² Bulk_quote::net_price()

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ item связан с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° Quote. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° функция print_total() Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ net_price(), выполнится Π΅Π΅ Π²Π΅Ρ€ΡΠΈΡ, опрСдСлСнная Π² классС Quote. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ item связан с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса Bulk_quote. Π’ этом Π²Ρ‹Π·ΠΎΠ²Π΅ функция print_total() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ net_price() класса Bulk_quote.

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

base = derived;     // ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒ Quote ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ

base.net_price(20); // Π²Ρ‹Π·ΠΎΠ² Quote::net_price()

Когда происходит Π²Ρ‹Π·ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ (Π½Π΅ ссылкой ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ), Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² привязываСтся Π²ΠΎ врСмя компиляции. НапримСр, ΠΊΠΎΠ³Π΄Π° происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ net_price() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° base, Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… вопросов ΠΎ выполняСмой вСрсии. МоТно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ‚.Π΅. содСрТимоС) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт base, Π½ΠΎ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ способа ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, этот Π²Ρ‹Π·ΠΎΠ² распознаСтся Π²ΠΎ врСмя компиляции ΠΊΠ°ΠΊ вСрсия Quote::net_price().

ΠšΠ»ΡŽΡ‡Π΅Π²Π°Ρ концСпция. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ Π² языкС Π‘++

Одной ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ООП являСтся ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (polymorphism). Π’ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ с грСчСского языка "ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ мноТСство Ρ„ΠΎΡ€ΠΌ. БвязанныС наслСдованиСм Ρ‚ΠΈΠΏΡ‹ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌ этих Ρ‚ΠΈΠΏΠΎΠ², игнорируя различия ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. ΠšΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ°ΠΌΠ½Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° Π² языкС Π‘++ являСтся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ статичСскиС ΠΈ динамичСскиС Ρ‚ΠΈΠΏΡ‹ ссылок ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

Когда ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ссылки ΠΈΠ»ΠΈ указатСля Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс происходит Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС, Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ функция, нСизвСстСн. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ. Если вызываСмая функция Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°, нСзависимо ΠΎΡ‚ фактичСского Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π° вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС. Если функция Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎ фактичСски выполняСмой вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ откладываСтся Π΄ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния. Она опрСдСляСтся Π½Π° основании Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ связана ссылка ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Ρ‚) для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции. Π’ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° фиксирован ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ β€” Π½ΠΈΠΊΠ°ΠΊ нСльзя Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ динамичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π΅Π³ΠΎ статичСского Ρ‚ΠΈΠΏΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции с вСрсиСй, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π²Ρ‹Π·ΠΎΠ² осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ссылку ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Волько Π² этих случаях динамичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π΅Π³ΠΎ статичСского Ρ‚ΠΈΠΏΠ°.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚, Π½ΠΎ Π½Π΅ обязан, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функция ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ, ΠΎΠ½Π° остаСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π²ΠΎ всСх ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах.

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

Π—Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ относится ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ функциям, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΌ ссылку (ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ) Π½Π° Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам связан наслСдованиСм. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Ρ‚ΠΈΠΏ D происходит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π’, Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ B*, Π° Π΅Π΅ вСрсия Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚ΠΈΠΏ D*. Но Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΈΠ· Ρ‚ΠΈΠΏΠ° D Π² Ρ‚ΠΈΠΏ Π’ Π±Ρ‹Π»ΠΎ доступно. Π”ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса рассматриваСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рассматриваСтся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.8.1.

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

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ final ΠΈ override

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

Поиск Ρ‚Π°ΠΊΠΈΡ… ошибок ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ΠΌ. По Π½ΠΎΠ²ΠΎΠΌΡƒ стандарту ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ясно ΠΏΠΎΠ½ΡΡ‚ΡŒ нашС Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΈ (Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ) позволяСт компилятору самому Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΎΡ‚Π²Π΅Ρ€Π³Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ссли функция, отмСчСнная ΠΊΠ°ΠΊ override, Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

struct Π’ {

 virtual void f1(int) const;

 virtual void f2();

 void f3();

};

struct D1 : B {

 void f1(int) const override; // ok: f1() соотвСтствуСт f1() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ

 void f2(int) override;       // ошибка: Π’ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f2(int)

 void f3() override;          // ошибка: f3() Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция

 void f4() override;          // ошибка: Π’ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f4()