Pure virtual function call
ΠΠΎΠΏΡΠΎΡ ΠΏΠΎ Π‘++. Π§ΡΠΎ Π·Π° ΠΎΡΠΈΠ±ΠΊΠ° Β«pure virtual function callΒ»? Π ΠΊΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π°? ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄, ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠΈΠΉ ΠΊ Π½Π΅ΠΉ.
Π’Π΅, ΠΊΡΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ Π² ΠΆΠΈΠ²ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈ Π½Π΅ Π·Π½Π°Π»ΠΈ ΠΏΡΠΎ Π½Π΅Ρ ΡΠ°Π½Π΅Π΅, Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° ΠΏΠΎΡΡΠ°ΡΠΈΠ»ΠΈ Π½Π΅ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΎΡΠ»ΠΎΠ² ΡΡΠΎΠ³ΠΎ Π±Π°Π³Π°. Π Π°Π·Π±Π΅ΡΡΠΌ Π΅Π³ΠΎ ΠΏΠΎ ΠΏΠΎΠ»ΠΎΡΠΊΠ°ΠΌ.
ΠΠΏΡΠΎΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ? ΠΠ±ΡΡΠ½ΠΎ ΠΎΠ½ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· Β«vtblΒ» (virtual table) β ΡΠ°Π±Π»ΠΈΡΡ Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ»Π°ΡΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ __vtbl Π½Π° ΡΠ°Π±Π»ΠΈΡΡ vtbl Π΄Π»Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ°. Π ΡΠ»ΡΡΠ°Π΅ Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΈ ΡΠΈΡΡΠΎΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π΅ΡΡΡ, Π½ΠΎ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ __pure_virtual_func_called(), ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ°ΠΊΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅. ΠΠΎ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π²ΡΠ·Π²Π°ΡΡ, Π²Π΅Π΄Ρ ΠΏΡΡΠΌΠ°Ρ ΠΏΠΎΠΏΡΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΎΡΠ»ΠΎΠ²Π»Π΅Π½Π° ΡΠΆΠ΅ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ?
Π Π°Π·Π±Π΅ΡΡΠΌ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ vtbl.
Π¨Π°Π³ 1. Π‘ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠ°ΡΡΡ Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ:
Π°) Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ __vtbl Π½Π° vtbl ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°;
Π±) Π‘ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°;
Π²) ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ΅Π»ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
Π¨Π°Π³ 2. ΠΠ°ΡΠ»Π΅Π΄ΡΠ΅ΠΌΠ°Ρ ΡΠ°ΡΡΡ(-ΠΈ) (ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ):
Π°) ΠΠΎΠΌΠ΅Π½ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ __vtbl Π½Π° vtbl ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ°;
Π±) Π‘ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ°;
Π²) ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ΅Π»ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΊΠ»Π°ΡΡΠ°-ΠΏΠΎΡΠΎΠΌΠΊΠ°.
Π’Π΅ΠΏΠ΅ΡΡ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅. ΠΠ΅ΡΠ»ΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°ΡΡΡΡ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Derived, ΡΠΎ Π½Π° ΡΠ°Π³Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΎΠ½ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π±ΡΠ΄Π΅Ρ Π΅ΡΠ΅ ΡΡΠΈΡΠ°ΡΡΡΡ Π±Π°Π·ΠΎΠ²ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΈ Π΅Π³ΠΎ vtbl Π±ΡΠ΄Π΅Ρ ΠΎΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ΠΠ±ΡΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π½Π΅ Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΡΡΡ ΡΠ°ΠΊΠΎΠ΅ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈ ΠΎΡΠΈΠ±ΠΊΠ° Π»ΠΎΠ²ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² runtime.
ΠΡΠ²ΠΎΠ΄: ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°Ρ ΠΈ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ°Ρ , ΠΏΡΠΈΡΡΠΌ ΠΊΠ°ΠΊ ΡΠ²Π½ΡΡ , ΡΠ°ΠΊ ΠΈ ΡΠ΅ΡΠ΅Π· Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
ΠΠΎΡΠΈΡΠ°ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Β artima.comΒ ΠΈΠ»ΠΈ Π² ΠΊΠ½ΠΈΠΆΠΊΠ΅ Π‘ΠΊΠΎΡΡΠ° ΠΠ°ΠΉΠ΅ΡΡΠ° Β«Effective C++Β», ΡΠΎΠ²Π΅Ρ Π½ΠΎΠΌΠ΅Ρ 9.