экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

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

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция β€” это функция-Ρ‡Π»Π΅Π½, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ прСдполагаСтся ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах. ΠŸΡ€ΠΈ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля ΠΈΠ»ΠΈ ссылки Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° нСзависимо ΠΎΡ‚ выраТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

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

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ ссылок ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π’Ρ‹Π·ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² соотвСтствии с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° вызываСтся.

Π’Ρ‹Π·ΠΎΠ² Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² соотвСтствии с Ρ‚ΠΈΠΏΠΎΠΌ указатСля ΠΈΠ»ΠΈ ссылки.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈ Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

virtual ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ объявлСнии пСрСопрСдСляСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС, Π½ΠΎ это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ; пСрСопрСдСлСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ всСгда ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ чистого описатСля. (Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΎ чистых Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… функциях см. Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ абстрактныС классы.)

Оба Π²Ρ‹Π·ΠΎΠ²Π° PrintBalance Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

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

НСдавно ΠΌΠ½Π΅ Π·Π°Π΄Π°Π»ΠΈ вопрос: ΠΊΠ°ΠΊ Π±Ρ‹ я Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° языкС C?

ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ я понятия Π½Π΅ ΠΈΠΌΠ΅Π», ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ: вСдь C Π½Π΅ являСтся языком ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΈ здСсь Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ понятия, ΠΊΠ°ΠΊ наслСдованиС. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ мСня ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π° с C, ΠΈ я Π·Π½Π°Π», ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, я ΠΏΠΎΠ΄ΡƒΠΌΠ°Π», Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ способ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ структуры (struct).

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

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² C++

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° C. Зная, Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСдставлСны Π² Π²ΠΈΠ΄Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ хранятся Π² vtable, Π° vtable β€” статичСский массив, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ структуру, ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ сам класс ClassA, Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ClassA, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ClassA.

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅, рСализация ClassA_get() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ set() Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ· vtable. Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса-наслСдника:

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит функция main() :

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, этот Ρ‚Ρ€ΡŽΠΊ Π½Π΅ выглядит Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΆΠ΅ СстСствСнно, ΠΊΠ°ΠΊ Π² C++ ΠΈΠ»ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ языкС программирования, ΠΈ ΠΌΠ½Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅, ΠΊΠΎΠ³Π΄Π° я писал ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° C, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

C++ MythBusters. ΠœΠΈΡ„ ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… функциях

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я рассказывал, с ΠΊΠ°ΠΊΠΎΠΉ Π½Π΅ всСм извСстной ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с подставляСмыми функциями. Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ»Π° ΠΊΠ°ΠΊ нСсколько сущСствСнных Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ, Ρ‚Π°ΠΊ ΠΈ многостраничныС споры (ΠΈ Π΄Π°ΠΆΠ΅ Ρ…ΠΎΠ»ΠΈΠ²Π°Ρ€Ρ‹), Π½Π°Ρ‡Π°Π²ΡˆΠΈΠ΅ΡΡ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ inline-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ C vs. C++ vs. Java vs. C# vs. PHP vs. Haskell vs. …

БСгодня ΠΏΡ€ΠΈΡˆΠ»Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. И, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, я сразу ΠΎΠ³ΠΎΠ²ΠΎΡ€ΡŽΡΡŒ, Ρ‡Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΡŒΡ моя (Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, ΠΊΠ°ΠΊ ΠΈ прСдыдущая) Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° ΠΏΠΎΠ»Π½ΠΎΡ‚Ρƒ излоТСния. А Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, эта ΡΡ‚Π°Ρ‚ΡŒΡ Π½Π΅ для профСссионалов. Она Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ разбираСтся Π² основах C++, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ нСдостаточно ΠΎΠΏΡ‹Ρ‚Π°, Π»ΠΈΠ±ΠΎ ΠΆΠ΅ Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Π½Π΅ Π»ΡŽΠ±ΠΈΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ½ΠΈΠΆΠ΅ΠΊ.

НадСюсь, всС Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΡΠ½ΡΡ‚ΡŒ это ΡƒΠΆΠ΅ Π½Π΅ моя Π·Π°Π΄Π°Ρ‡Π°. Π£Π²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ RFry Π² Ρ†ΠΈΠΊΠ»Π΅ своих статСй ΠΎ Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ добСрСтся ΠΈ Π΄ΠΎ Π½ΠΈΡ….

Если Π² ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΏΡ€ΠΎ inline-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΈΡ„ Π±Ρ‹Π» Π½Π΅ совсСм ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½, Ρ‚ΠΎ Π² этом β€” Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ². БобствСнно, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Β«ΠΌΠΈΡ„ΡƒΒ».

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual

К ΠΌΠΎΠ΅ΠΌΡƒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡŽ, я ΠΎΡ‡Π΅Π½ΡŒ часто сталкивался ΠΈ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡΡŒ с людьми (Π΄Π° Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, я ΠΈ сам Π±Ρ‹Π» Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual Π΄Π΅Π»Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ. Объясню, Ρ‡Ρ‚ΠΎ имССтся Π² Π²ΠΈΠ΄Ρƒ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

pA is B:
B::foo() // ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС A ΠΌΠ΅Ρ‚ΠΎΠ΄ foo() ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual
B::bar() // ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС A ΠΌΠ΅Ρ‚ΠΎΠ΄ bar() ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual
A::baz() // ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС A ΠΌΠ΅Ρ‚ΠΎΠ΄ baz() Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual

pA is C:
Π‘::foo() // ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС B ΠΌΠ΅Ρ‚ΠΎΠ΄ foo() ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual
B::bar() // ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ классС B ΠΌΠ΅Ρ‚ΠΎΠ΄ bar() Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual,
// Π½ΠΎ ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual Π² классС A, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ
A::baz() // ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² классС A ΠΌΠ΅Ρ‚ΠΎΠ΄ baz() Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ virtual

Π‘ Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ baz() всё ΠΈ Ρ‚Π°ΠΊ ясно. А Π²ΠΎΡ‚ с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Π²Ρ‹Π·ΠΎΠ²Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ нСувязочка. Π”ΡƒΠΌΠ°ΡŽ, Π½Π΅ стоит Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Π’Ρ‹Π²ΠΎΠ΄: Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция становится Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual являСтся Β«ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΒ» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·, Π° Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ‹ ΠΎΠ½ΠΎ нСсСт Π² сСбС чисто ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для удобства программистов.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ происходит, Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

Π Π°Π½Π½Π΅Π΅ ΠΈ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС. Π’Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

БвязываниС β€” это сопоставлСниС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ. Π’ C++ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π½Π½Π΅Π΅ связываниС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ компилятор ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ Ρ€Π΅ΡˆΠ°ΡŽΡ‚, какая ΠΈΠΌΠ΅Π½Π½ΠΎ функция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π°, Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎΠ΅ Ρ‚Π΅Π»ΠΎ выбираСтся Π½Π° этапС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ВстрСтив ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual, компилятор ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС: для Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ создаСт для класса Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Π² класс добавляСт Π½ΠΎΠ²Ρ‹ΠΉ скрытый для программиста Ρ‡Π»Π΅Π½ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. (На самом Π΄Π΅Π»Π΅, насколько я знаю, стандарт языка Π½Π΅ прСдписываСт, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ рСализация Π½Π° основС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ стала стандартом Π΄Π΅ Ρ„Π°ΠΊΡ‚ΠΎ.). Рассмотрим этот ΠΏΡ€ΡƒΡ„ΠΊΠΎΠ΄:

Π’Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, Π½ΠΎ Π² ΠΌΠΎΠ΅ΠΌ случаС (Win32, msvc2008) ΠΎΠ½ Π±Ρ‹Π» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΠ· этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅Ρ€ «пустого» класса всСгда большС нуля, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ вставляСт Π² Π½Π΅Π³ΠΎ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‡Π»Π΅Π½. Как ΠΏΠΈΡˆΠ΅Ρ‚ ЭккСль, Β«ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ процСсс индСксирования Π² массивС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΈ всС станСт ясно» πŸ˜‰ Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ «нСпустого» класса NotEmptyVirt ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² Π½Π΅Π³ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ увСличился Π½Π° стандартный Ρ€Π°Π·ΠΌΠ΅Ρ€ указатСля Π½Π° void; Π° Π² «пустом» классС EmptyVirt Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‡Π»Π΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилятор Ρ€Π°Π½Π΅Π΅ добавлял для привСдСния класса ΠΊ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, Π±Ρ‹Π» Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² класс Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π΅ влияСт (спасибо nullbie Π·Π° совСт). Имя указатСля Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ отличаСтся Π² зависимости ΠΎΡ‚ компилятора. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, компилятор Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ __vfptr, Π° саму Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ β€˜vftable’ (ΠΊΡ‚ΠΎ Π½Π΅ Π²Π΅Ρ€ΠΈΡ‚, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ πŸ™‚ Π’ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ VPTR, Π° саму Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ VTABLE, поэтому я Π±ΡƒΠ΄Ρƒ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΡ… ΠΆΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π§Ρ‚ΠΎ прСдставляСт собой Ρ‚Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π°? Π’Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² сСбС адрСса всСх Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса (ΠΏΠΎ сути, это массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ), Π° Ρ‚Π°ΠΊΠΆΠ΅ всСх Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов этого класса.

Π’Π°Π±Π»ΠΈΡ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько Π΅ΡΡ‚ΡŒ классов, содСрТащих Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½Π° класс. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· классов содСрТат ΠΈΠΌΠ΅Π½Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π° Π½Π΅ саму Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ! Вопросы Π½Π° эту Ρ‚Π΅ΠΌΡƒ Π»ΡŽΠ±ΡΡ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π΅, ΠΊΡ‚ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ собСсСдования. (ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠ°Π²Π΅Ρ€Π·Π½Ρ‹Ρ… вопросов, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π»ΠΎΠ²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ²: «Ссли класс содСрТит Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ количСства Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, содСрТащихся Π² Π½Π΅ΠΌ, Π²Π΅Ρ€Π½ΠΎ?Β»; Β«ΠΈΠΌΠ΅Π΅ΠΌ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов β€” сколько Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ?Β» ΠΈ Ρ‚.Π΄.).

Π˜Ρ‚Π°ΠΊ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ‚Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. КаТдой Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса присваиваСтся подряд ΠΈΠ΄ΡƒΡ‰ΠΈΠΉ индСкс (Π² порядкС объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π² послСдствиС ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ адрСс Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ VTABLE. ΠŸΡ€ΠΈ наслСдовании Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс Β«ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Β» ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ адрСсов Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Если ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС пСрСопрСдСляСтся, Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ этого класса адрСс Ρ‚Π΅Π»Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° просто Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс Π½ΠΎΠ²Ρ‹Ρ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² VTABLE ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ, Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса СстСствСнно остаСтся Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π±Ρ‹Π»Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс нСльзя Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π±Ρ‹Π»ΠΎ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ β€” вСдь Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΎ Π½ΠΈΡ… Π½ΠΈΡ‡Π΅Π³ΠΎ Β«Π½Π΅ Π·Π½Π°Π΅Ρ‚Β» (дальшС ΠΌΡ‹ всС это посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅).

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ: ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ VPTR адрСсом ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, сначала вызываСтся конструктор Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ VPTR адрСсом «своСй» Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π·Π°Ρ‚Π΅ΠΌ вызываСтся конструктор ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСзаписываСт это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· адрСс Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ β€” Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс) компилятор сначала Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ VPTR ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса, Π° ΠΈΠ· Π½Π΅Ρ‘ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСс Ρ‚Π΅Π»Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого Π΄Π΅Π»Π°Ρ‚ΡŒ call.

Из всСго Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ связывания Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (инициализация VPTR конструктором, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ адрСса Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅) ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π°Π½Π½ΠΈΠΌ.

Π”ΡƒΠΌΠ°ΡŽ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ всС станСт понятнСС. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ:

экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π€ΠΎΡ‚ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

Base
0Base::foo()
1Base::bar()
2Base::baz()

ΠΈ

Inherited
0Base::foo()
1Inherited::bar()
2Base::baz()
3Inherited::qux()

Как Π²ΠΈΠ΄ΠΈΠΌ, Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса адрСс Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±Ρ‹Π» Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ. ΠŸΡ€ΡƒΡ„ΠΊΠΎΠ΄:

ВСрнСмся ΠΊ ΠΌΠΈΡ„Ρƒ. Бтановится ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция Π±Ρ‹Π»Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ.

Π’Π°ΠΊΠΆΠ΅ становится понятно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΏΠΎ адрСсу ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· ссылки). Как я ΡƒΠΆΠ΅ сказал, Π² этой строкС
Base * pBase = new Inherited;
происходит ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°: Inherited* приводится ΠΊ Base*, Π½ΠΎ Π² любом случаС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ всСго лишь Ρ…Ρ€Π°Π½ΠΈΡ‚ адрСс Β«Π½Π°Ρ‡Π°Π»Π°Β» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² памяти. Если ΠΆΠ΅ ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ нСпосрСдствСнно для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ ΠΎΠ½ фактичСски «обрСзаСтся» Π΄ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‡Ρ‚ΠΎ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Β«Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Β» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π½Π½Π΅Π΅ связываниС β€” компилятор ΠΈ Ρ‚Π°ΠΊ Β«Π·Π½Π°Π΅Ρ‚Β» фактичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

БобствСнно, это всё. Π–Π΄Ρƒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Бпасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² C++ (virtual functions)

экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π€ΠΎΡ‚ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’ Π‘++ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (virtual functions) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (polymorhpism) классов. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ классов, Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡ… Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ (virtual methods). ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΌΡ‹ рассмотрим Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса.

БтатичСскоС ΠΈΠ»ΠΈ Ρ€Π°Π½Π½Π΅Π΅ связываниС (static/early binding)

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, ΠΊΠ°ΠΊ происходит Π²Ρ‹Π·ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² классов. Π’Ρ‹Π·ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² происходит Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ статичСским (статичным) связываниСм (static binding) ΠΈΠ»ΠΈ Ρ€Π°Π½Π½ΠΈΠΌ связываниСм (early binding).

Π Π°Π½Π½Π΅Π΅ связываниС использовалось Π²ΠΎ всСх функциях ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅Ρ… случаСв, Π³Π΄Π΅ ΠΌΡ‹ использовали ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Когда ΠΌΡ‹ запускаСм сборку (building) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, компилятор просматриваСт исходный ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ процСссора. Допустим, Π² ΠΊΠΎΠ΄Π΅ встрСчаСтся Π²Ρ‹Π·ΠΎΠ² ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Если это обычная функция (Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ), Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π½Π½Π΅Π³ΠΎ связывания.

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ взглянСм Π½Π° нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

На экран Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ Π΄Π²Π΅ строки Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс. На этапС компиляции ΠΏΠ°ΠΌΡΡ‚ΡŒ выдСляСтся для Π΄Π²ΡƒΡ… ΠΊΠΎΠΏΠΈΠΉ Method – для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ. Оба адрСса ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²: Base::Method, Derived::Method. Π’.Π΅. ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Method, Ρ‚ΠΎ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вызываСтся свой ΠΌΠ΅Ρ‚ΠΎΠ΄, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Derived::Method:

Π—Π΄Π΅ΡΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ классов оставим Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠŸΠΎΡ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с указатСлями:

Π‘Π°ΠΌΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ здСсь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ компилятор спокойно β€œΠΏΡ€ΠΎΠ³Π»Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚β€ Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Base ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ классы ΡΠ²Π»ΡΡŽΡ‚ΡΡ совмСстимыми ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ.

Π’ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ процСссор Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ b – это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Base. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Derived. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° b процСссор ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ адрСсу Base::Method.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ b Π²Ρ‹Π·Π²Π°Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ Derived::Method, Π½ΡƒΠΆΠ½ΠΎ привСсти Ρ‚ΠΈΠΏ. НапримСр, Ρ‚Π°ΠΊ:

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π½Π½Π΅Π³ΠΎ связывания (статичСского).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π»ΠΈ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Base ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Derived, Π° Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚:

Π­Ρ‚ΠΎΡ‚ случай Π½Π°ΠΌ Π½Π΅ интСрСсСн. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈ компиляции Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка – здСсь Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ static_cast ΠΈΠ»ΠΈ dynamic_cast. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ случай, ΠΊΠΎΠ³Π΄Π° Base* ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Derived. Π’ этом случаС появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (polymorphism).

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (polymorphism) ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ (polymorphic types)

Рассмотрим Π³ΠΈΠΏΠΎΡ‚Π΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ: Π² ΠΈΠ³Ρ€Π΅ Π΅ΡΡ‚ΡŒ нСсколько Ρ‚ΠΈΠΏΠΎΠ² монстров. ВсС монстры ΠΌΠΎΠ³ΡƒΡ‚ Π°Ρ‚Π°ΠΊΠΎΠ²Π°Ρ‚ΡŒ (attack) ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ (move). ΠŸΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²ΠΈΠ΄ монстров Π΄Π΅Π»Π°Π΅Ρ‚ это ΠΏΠΎ своСму: Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Ρ‚ΠΈ, Π° Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π·Π° ΠΏΠ°Π·ΡƒΡ…ΠΎΠΉ припрятан Π³Ρ€Π°Π½Π°Ρ‚ΠΎΠΌΡ‘Ρ‚. move ΠΈ attack ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ для всСх монстров класс:

экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π€ΠΎΡ‚ΠΎ экономия ΠΊΠΎΠ΄Π° с использованиСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

НСплохо Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всСх этих классов вмСстС ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ синтаксис для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² этих классов. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ (polymorphism) – ΠΌΠ½ΠΎΠ³ΠΎ (ΠΎΡ‚ грСчСского ΠΏΠΎΠ»ΠΈ) Ρ„ΠΎΡ€ΠΌ (ΠΎΡ‚ грСчСского ΠΌΠΎΡ€Ρ„). Π’.Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этих классов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ массивС.

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ для этого Π½Π΅ годится массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ‚Π°ΠΊΠΎΠΌ массивС для элСмСнтов выдСляСтся фиксированноС количСство памяти. БоотвСтствСнно, для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Какой Ρ‚ΠΈΠΏ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ? Как ΠΌΡ‹ выяснили Ρ€Π°Π½ΡŒΡˆΠ΅, Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ любого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° – Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ классы ΡΠ²Π»ΡΡŽΡ‚ΡΡ совмСстимыми ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰ΠΈΠΉ класс ΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ всС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы.

ΠšΠ»Π°ΡΡΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для получСния эффСкта ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (polymorphic types).

Π’ C++ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ рСализуСтся Ρ‡Π΅Ρ€Π΅Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ классам, ΠΌΡ‹ рассмотрим динамичСскоС связываниС.

ПозднСС/динамичСскоС связываниС (late/dynamic binding)

Поздним связываниСм Π² C++ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (function pointers). ΠœΡ‹ ΠΈΡ… ΡƒΠΆΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Π»ΠΈ, поэтому слоТностСй Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ. Π‘Ρ€Π°Π·Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

someFunction ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ€Π°Π½Π½ΠΈΠΌ связываниСм. Π’.Π΅. Π½Π° этапС компиляции для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выдСляСтся участок памяти, Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ адрСс этого участка становится адрСсом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. АдрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Тёстко привязан ΠΊ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – ΠΈΡ… нСльзя ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ.

functionPointer ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ динамичСским (dynamic) ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΈΠΌ связываниСм (late binding). На ΠΊΠ°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, становится извСстно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΈ этом functionPointer ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚.Π΅. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля functionPointer ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ связываниС.

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ связывания Π² C++ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (virtual functions). На самом Π΄Π΅Π»Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ – это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но ΠΎΠ± этом Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ/ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (virtual functions/methods)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virutal ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°:

Π’Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π₯отя ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Ρ‚Π°ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual (это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ). Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° наш ΠΊΠΎΠ΄:

Π’ΠΎ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ! Π’Π΅ΠΏΠ΅Ρ€ΡŒ вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΎΠ³ΠΎ класса, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° самом Π΄Π΅Π»Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. НаконСц-Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ любого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса:

    НСсколько Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ ΠΏΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ функциям:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΎΡ‡Π΅Π½ΡŒ просто. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ стоят Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ функциями.

Π’Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (virtual function table)

Рассмотрим простой ΠΊΠΎΠ΄:

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Base::vf ΠΈ Derived::vf ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Об этом Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС. А ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс наслСдуСт это свойство для своСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΠ°ΠΌΡΡ‚ΡŒ выдСляСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ…: Π½Π° этапС компиляции ΠΏΠΎΠ΄ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ участки памяти, ΠΏΠ΅Ρ€Π²Ρ‹Π΅ адрСса ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ адрСсами ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Но Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅, Ρ‚ΠΎ фактичСскиС адрСса ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ привязываСтся ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ: Base::vf ΠΈ Derived::vf. АдрСс ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ назначаСтся Π½Π° этапС компиляции ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ памяти, Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ настоящим (ΠΈΠ»ΠΈ фактичСским) адрСсом.

Когда Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ хотя Π±Ρ‹ ΠΎΠ΄Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция, Ρ‚ΠΎ для всСх ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Ρ… классов создаётся Ρ‚Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (virtual function table).

Π’ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ названия этой Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹: virtual function table, virtual method table, vtable, vftable.

Π’Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ – это ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π² массивС Ρ€Π°Π²Π½ΠΎ количСству Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² классС.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎΠ³ΠΎ класса (Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΈ всСх ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…) создаётся своя Ρ‚Π°Π±Π»ΠΈΡ†Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π²ΠΎ всСх этих Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅.

ИмСнно Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ настоящиС адрСса ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚.Π΅. элСмСнт Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Для всСх ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Ρ… классов Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ значСния. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса здСсь Π±ΡƒΠ΄ΡƒΡ‚ записаны адрСса ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса.

Помимо создания Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»Π΅ __vfptr – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° vtable. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ наслСдуСтся всСми ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ классами. __vfptr ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

__vfptr ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° vtable класса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Допустим, Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: f – Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ ΠΈ vf – Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ:

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС компилятор Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ внимания, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π° самом Π΄Π΅Π»Π΅ хранится Π² object. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ смотрит Π½Π° Ρ‚ΠΈΠΏ укзаталя ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ – Base::f().

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС процСссор Π²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ vf – Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ ΠΈΡ‰Π΅Ρ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½ΡƒΠΆΠ½ΡƒΡŽ запись. Но адрСс Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ½ ΡƒΠ·Π½Π°Ρ‘Ρ‚ Ρ‡Π΅Ρ€Π΅Π· __vfptr, Π° этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ своСго класса. БоотвСтствСнно, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΎΠ³ΠΎ класса, Ρ‡Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ vf.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… случаях компилятор ΠΎΡ‚Π΄Ρ‹Ρ…Π°Π΅Ρ‚ – ΠΎΠ½ Π΄Π°ΠΆΠ΅ Π½Π΅ пытаСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π½Π½Π΅ΠΌ ΠΈ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌ связывании ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ классов Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ дСструктор (virtual destructor)

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

Π₯отя, Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния – Π² Π΄Π°Π½Π½ΠΎΠΌ дСструкторС (ΠΈ Π² дСструкторах ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов) Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит.

АбстрактныС классы (abstract classes) ΠΈ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (pure virtual functions)

ΠžΡ‡Π΅Π½ΡŒ часто Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π΅ трСбуСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π’.Π΅. Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ свойства для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов. Π’Π°ΠΊΠΈΠ΅ классы ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ абстрактными (abstract class). ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° абстрактного класса, компилятор выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ класс абстрактным, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ чистой.

Чистая Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция (pure virtual function) ΠΊΠ°ΠΊ Π±Ρ‹ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классах.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ чистой (pure), Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ послС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ символы =0 (Π·Π½Π°ΠΊ равСнства ΠΈ ноль):

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Помимо этого Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ нСльзя ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Base, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ стал абстрактным.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ =0 Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎ всСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ функциям, достаточно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ язык программирования высокого уровня. НаиболСС просто это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ассСмблСра, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π΅Ρ‰Ρ‘ Π½Π΅ Π·Π½Π°Π΅ΠΌ.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ я ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π΅Π·ΡŽΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΡƒΡ€ΠΎΠΊΠ°.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, подставляСтся Π΅Ρ‘ адрСс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» присвоСн Π½Π° этапС компиляции. Π­Ρ‚ΠΎ Ρ€Π°Π½Π½Π΅Π΅ ΠΈΠ»ΠΈ статичСскоС связываниС (early/static binding).

ΠŸΡ€ΠΈ использовании указатСля Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² Π½Ρ‘ΠΌ хранится адрСс фактичСского мСстополоТСния Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎΡ‚ адрСс Π±Ρ‹Π» Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π½Π° этапС компиляции (Π°Π±Π·Π°Ρ† Π²Ρ‹ΡˆΠ΅), Π½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ своё Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎ врСмя Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ указатСля Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ/динамичСского связывания (late/dynamic binding). Π•Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ связывания ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова virtual Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС. ΠŸΡ€ΠΈ этом для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈ для всСх ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… создаётся Ρ‚Π°Π±Π»ΠΈΡ†Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²/Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (virtual function table ΠΈΠ»ΠΈ vtable). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса создаётся своя Ρ‚Π°Π±Π»ΠΈΡ†Π°. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтво Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ€Π°Π²Π½ΠΎ количСству Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ хранятся фактичСскиС адрСса ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π² классах. Π’Π°ΠΊΠΆΠ΅ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ __vfptr (наслСдуСтся всСми ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ классами) – ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса. Π’.Π΅. ΠΊΠΎΠ³Π΄Π° создаётся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ самого класса ΠΈΠ»ΠΈ любого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Π² Π½Ρ‘ΠΌ __vfptr присваиваСтся адрСс Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ этого класса (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…).

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½Ρ‹ Π² C++ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ синтаксис для Ρ€Π°Π·Π½Ρ‹Ρ… классов:

Copyright 2021. All rights reserved.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *