Π ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Widget Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ ΡΠ°ΠΊ:
β’ ΠΠΎΠ΄Ρ ΠΎΠ΄ A: 1 ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ + 1 Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ + n ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΉ
β’ ΠΠΎΠ΄Ρ ΠΎΠ΄ B: n ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² + n Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠΎΠ²
ΠΠ»Ρ ΠΊΠ»Π°ΡΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΠ°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ-Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ A ΠΎΠ±ΡΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½. ΠΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΡΠΎ Π²Π΅ΡΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ n Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΊΠΎ. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ B Π»ΡΡΡΠ΅. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π² ΡΠ»ΡΡΠ°Π΅ A ΠΈΠΌΡ w Π²ΠΈΠ΄ΠΈΠΌΠΎ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ (Π²ΠΊΠ»ΡΡΠ°ΡΡΠ΅ΠΉ Π² ΡΠ΅Π±Ρ ΡΠΈΠΊΠ»), ΡΠ΅ΠΌ Π² ΡΠ»ΡΡΠ°Π΅ B, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΉ ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ Π΄Π»Ρ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ (1) Π½Π΅Ρ Π°ΠΏΡΠΈΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡΡ Π΄Π΅ΡΠ΅Π²Π»Π΅, ΡΠ΅ΠΌ ΠΏΠ°ΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ-Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ, ΠΈ (2) ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΡΠ°ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΡΠΈΡΠΈΡΠ½Π°, ΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ B.
Π§ΡΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡβ’ ΠΡΠΊΠ»Π°Π΄ΡΠ²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΠ½Π΅Π΅ ΠΈ ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ.
ΠΡΠ°Π²ΠΈΠ»ΠΎ 27: ΠΠ΅ Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±Π»ΡΠΉΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠΎΠ²
ΠΡΠ°Π²ΠΈΠ»Π° C++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Ρ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΠΏΠ°ΠΌΠΈ Π±ΡΠ»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ, Π΅ΡΠ»ΠΈ Π²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ, Π·Π½Π°ΡΠΈΡ, ΠΎΠ½Π° Π½Π΅ ΠΏΡΡΠ°Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΠΈΠ»ΠΈ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ. ΠΡΠΎ ΡΠ΅Π½Π½Π°Ρ Π³Π°ΡΠ°Π½ΡΠΈΡ. ΠΠ΅ Π½Π°Π΄ΠΎ ΠΎΡ Π½Π΅Π΅ ΠΎΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΠ±Ρ ΠΎΠ΄ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ². Π ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ Π»Π΅Π³ΠΊΠΎ, Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ β ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΡΠ΄Π½ΠΎ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠΈΡΠ»ΠΈ ΠΊ C++ ΠΈΠ· ΠΌΠΈΡΠ° C, Java ΠΈΠ»ΠΈ C#, ΠΏΡΠΈΠΌΠΈΡΠ΅ ΡΡΠΎΠΊ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠ·ΡΠΊΠ°Ρ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡΡ ΡΠΈΠΏΠΎΠ² ΡΠ°ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ, ΠΈ ΠΎΠ½ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠΏΠ°ΡΠ½Ρ, ΡΠ΅ΠΌ Π² C++. ΠΠΎ C++ β ΡΡΠΎ Π½Π΅ C. ΠΡΠΎ Π½Π΅ Java. ΠΡΠΎ Π½Π΅ C#. Π ΡΡΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β ΡΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡΡ Ρ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ΠΌ.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΎΠ±Π·ΠΎΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠΈ ΡΠ°Π·Π½ΡΡ ΡΠΏΠΎΡΠΎΠ±Π° Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅. ΠΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠΈΠ»Π΅ C Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
(T) expression // ΠΏΡΠΈΠ²Π΅ΡΡΠΈ expression ΠΊ ΡΠΈΠΏΡ T
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ²:
T( expression) // ΠΏΡΠΈΠ²Π΅ΡΡΠΈ expression ΠΊ ΡΠΈΠΏΡ T
ΠΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌΠΈ Π΄Π²ΡΠΌΡ ΡΠΎΡΠΌΠ°ΠΌΠΈ Π½Π΅Ρ ΠΎΡΡΡΠΈΠΌΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠΈΡ, ΠΏΡΠΎΡΡΠΎ ΡΠΊΠΎΠ±ΠΊΠΈ ΡΠ°ΡΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ. Π― Π½Π°Π·ΡΠ²Π°Ρ ΡΡΠΈ ΡΠΎΡΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡΠΌΠΈ Π² ΡΡΠ°ΡΠΎΠΌ ΡΡΠΈΠ»Π΅.
C++ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΡΡΡΠ΅ Π½ΠΎΠ²ΡΠ΅ ΡΠΎΡΠΌΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² (ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡΠΌΠΈ Π² ΡΡΠΈΠ»Π΅ Π‘++):
const_cast<T>(expression)
dynamic_cast<T>(expression)
reinterpret_cast<T>(expression)
static_cast<T>(expression)
Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΡΠ²ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅:
β’ const_cast ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΡΠ±ΡΠΎΡΠΈΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠΈΠΊΠ°ΠΊΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠΈΠ»Π΅ C++ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ;
β’ dynamic_cast ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Β«Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ½ΠΈΠΆΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡΒ» (downcasting). ΠΡΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ Π»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²ΠΈΠ΄ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ°ΡΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°. ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ ΠΎΡΡΡΠΈΠΌΡΡ Π·Π°ΡΡΠ°Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΠΎΠ·ΠΆΠ΅);
β’ reinterpret_cast ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ (ΡΠΎ Π΅ΡΡΡ Π½Π΅ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΠ΅) ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΊ int. ΠΠ½Π΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΠ°ΠΊΠΎΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ΅Π΄ΠΊΠΎ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΅Π³ΠΎ Π² ΡΡΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ Π»ΠΈΡΡ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΡΠΆΠ΄Π°Π» Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ ΠΏΠ°ΠΌΡΡΠΈ (ΡΠΌ. ΠΏΡΠ°Π²ΠΈΠ»ΠΎ 50);
β’ static_cast ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌ (ΠΊΠ°ΠΊ Π² ΠΏΡΠ°Π²ΠΈΠ»Π΅ 3), int ΠΊ double ΠΈ Ρ. ΠΏ.). ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ void* ΠΊ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ). ΠΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊ Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΌΡ ΡΡΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ (ΡΡΠΎ Π²ΠΎΡΡΠΈΠ½Π° const_cast).
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ Π² ΡΡΠ°ΡΠΎΠΌ ΡΡΠΈΠ»Π΅ ΠΎΡΡΠ°Π΅ΡΡΡ Π²ΠΏΠΎΠ»Π½Π΅ Π·Π°ΠΊΠΎΠ½Π½ΡΠΌ, Π½ΠΎ Π½ΠΎΠ²ΡΠ΅ ΡΠΎΡΠΌΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΈΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π»Π΅Π³ΡΠ΅ Π½Π°ΠΉΡΠΈ Π² ΠΊΠΎΠ΄Π΅ (ΠΈ Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΈ Π΄Π»Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ grep), ΡΡΠΎ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΊΠΎΠ΄Π΅ ΡΠ΅Ρ ΠΌΠ΅ΡΡ, Π³Π΄Π΅ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π°Π΅ΡΡΡ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠΎ-Π²ΡΠΎΡΡΡ , Π±ΠΎΠ»Π΅Π΅ ΡΠ·ΠΊΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°ΠΌ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ Π² ΡΡΠΈΠ»Π΅ C++, ΠΊΡΠΎΠΌΠ΅ const_cast, ΡΠΎ Π²Π°Ρ ΠΊΠΎΠ΄ Π½Π΅ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ.
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠ°ΡΠΎΠΌ ΡΡΠΈΠ»Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΎΡΡ Π²ΡΠ·Π²Π°ΡΡ explicit ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
class Widget {
public:
explicit Widget(int size);
...
};
void doSomeWork(const Widget& w);
doSomeWork(Widget(15)); // ΡΠΎΠ·Π΄Π°ΡΡ Widget ΠΈΠ· int
// Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ
doSomeWork(static_cast<Widget>(15)); // ΡΠΎΠ·Π΄Π°ΡΡ Widget ΠΈΠ· int
// Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π² ΡΡΠΈΠ»Π΅ C++
ΠΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ Β«ΠΎΡΡΡΠ°Π΅ΡΡΡΒ» ΠΊΠ°ΠΊ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π»ΡΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΌΠ΅ΡΡΠΎ static_cast. ΠΠ° ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅, ΠΊΠΎΠ΄, Π²Π΅Π΄ΡΡΠΈΠΉ ΠΊ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠΌΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΎΠ±ΡΡΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠ°Π·ΡΠΌΠ½ΡΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π΅Π³ΠΎ ΠΏΠΈΡΠ΅ΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΡΡΠ΅ Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°ΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ Π½Π° ΠΎΡΡΡΠ΅Π½ΠΈΡ ΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡΠΌΠΈ Π² Π½ΠΎΠ²ΠΎΠΌ ΡΡΠΈΠ»Π΅.
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΠΏΠΎΠ»Π°Π³Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΏ ΠΊΠ°ΠΊ Π΄ΡΡΠ³ΠΎΠΉ, Π½ΠΎ ΠΎΠ½ΠΈ Π·Π°Π±Π»ΡΠΆΠ΄Π°ΡΡΡΡ. ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠ° Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° (ΠΊΠ°ΠΊ ΡΠ²Π½ΡΠ΅, ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΈ Π½Π΅ΡΠ²Π½ΡΠ΅, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΡΠ°ΠΌΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ) ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ:
int x, y;
...
double d = static_cast<double>(x)/y; // Π΄Π΅Π»Π΅Π½ΠΈΠ΅ x Π½Π° y Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
// Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ
ΠΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ int x ΠΊ ΡΠΈΠΏΡ double ΠΏΠΎΡΡΠΈ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ int ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ double. ΠΡΠ»ΠΈ ΡΡΠΎ Π²Π°Ρ Π½Π΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ΄ΠΈΠ²ΠΈΠ»ΠΎ, Π½ΠΎ Π²Π·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
class Base {...};
class Derived: public Base {...};
Derived d;
Base *pb = &d; // Π½Π΅ΡΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Derived*
// Π² Base*
ΠΠ΄Π΅ΡΡ ΠΌΡ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΡΡΠΈ Π΄Π²Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Derived* ΠΏΡΠΈΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Base*.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° Derived) ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π΄ΡΠ΅Ρ ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½Π° Base* ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π°Π΄ΡΠ΅ΡΠ° ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΊΠ°ΠΊ Π½Π° Derived*). Π’Π°ΠΊΠΎΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² C. Π’Π°ΠΊΠΎΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Java. Π’Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π±ΡΠ²Π°Π΅Ρ Π² C#. ΠΠΎ ΡΡΠΎ ΡΠ»ΡΡΠ°Π΅ΡΡΡ Π² C++. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠ°ΠΊΠΎΠ΅ ΡΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠΏΠ»ΠΎΡΡ ΠΈ ΡΡΠ΄ΠΎΠΌ, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΈ ΠΏΡΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΠΎΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ. ΠΡΠΎ ΠΊΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΠΌΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ Π½Π° C++, Π²Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠΎΠΈΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, ΠΈ ΡΠΆ ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² Π½Π° Π±Π°Π·Π΅ ΡΡΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊ ΡΠΈΠΏΡ char* ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, Ρ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ±Π°Π²Π»ΡΡΡ Β«ΠΈΠ½ΠΎΠ³Π΄Π°Β». Π‘ΠΏΠΎΡΠΎΠ±Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΡΠΏΠΎΡΠΎΠ±Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈΡ Π°Π΄ΡΠ΅ΡΠΎΠ² ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ. Π Π·Π½Π°ΡΠΈΡ, ΠΈΠ· ΡΠΎΠ³ΠΎ, ΡΡΠΎ Β«Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ Ρ ΡΠ°Π½ΠΈΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΏΠ°ΠΌΡΡΠΈΒ» Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅, Π²ΠΎΠ²ΡΠ΅ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ, ΡΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΈΡ Π²ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΡΡΡΠΎΠ΅Π½ΠΎ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅. ΠΠΈΡ ΠΏΠΎΠ»ΠΎΠ½ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ²ΠΎΠΈΠ»ΠΈ ΡΡΠΎΡ ΡΡΠΎΠΊ, Π·Π°ΠΏΠ»Π°ΡΠΈΠ² ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²ΡΡΠΎΠΊΡΡ ΡΠ΅Π½Ρ.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠ°ΡΠ°ΡΡΠΈΠΉΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ, β Π΅ΡΠ΅ Π² ΡΠΎΠΌ, ΡΡΠΎ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ (ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ Π½Π° Π΄ΡΡΠ³ΠΈΡ ΡΠ·ΡΠΊΠ°Ρ ), Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΊΠ°ΡΠΊΠ°ΡΠ°Ρ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°Ρ , Π²Π½Π°ΡΠ°Π»Π΅ Π²ΡΠ·ΡΠ²Π°Π»ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ Window ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΎΡ Π½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡ SpecialWindow, ΠΏΡΠΈΡΠ΅ΠΌ Π² ΠΎΠ±ΠΎΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ onResize. ΠΠ°Π»Π΅Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ onResize ΠΈΠ· SpecialWindow Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠ½Π°ΡΠ°Π»Π° onResize ΠΈΠ· Window. Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Ρ ΠΎΡΠΎΡΠΎ, Π½ΠΎ ΠΏΠΎ ΡΡΡΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°:
class Window { // Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ
public:
virtual void onResize() {...} // ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ onResize Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ
... // ΠΊΠ»Π°ΡΡΠ΅
};
class SpecialWindow: public Window { // ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΊΠ»Π°ΡΡ
public:
virtual void onResize() { // ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ onResize
static_cast<Window>(*this).onResize(); // Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅;