ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΊΠΎΠ΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
ΠΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½, ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ . ΠΡΠΈ ΡΡΡΠ»ΠΊΠ΅ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΡΡΡΠ»ΠΊΠΈ Π½Π° Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·Π²Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²Π΅ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
ΠΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π²ΡΠ·ΠΎΠ² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ.
Π€ΡΠ½ΠΊΡΠΈΠΈ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ , ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΈΡ ΡΠΈΠΏ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ. Π€ΡΠ½ΠΊΡΠΈΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΌ ΡΠΈΠΏΠΎΠΌ; ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ.
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ ΡΡΡΠ»ΠΎΠΊ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°.
ΠΡΠ·ΠΎΠ² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π±Π°Π·ΠΎΠ²ΡΠΌ ΡΠΈΠΏΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ.
ΠΡΠ·ΠΎΠ² Π½Π΅Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠΈΠΏΠΎΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΡΡΡΠ»ΠΊΠΈ.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈ Π½Π΅Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ.
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 | |
0 | Base::foo() |
1 | Base::bar() |
2 | Base::baz() |
ΠΈ
Inherited | |
0 | Base::foo() |
1 | Inherited::bar() |
2 | Base::baz() |
3 | Inherited::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.