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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Ρ‹ программирования Π½Π° Π‘++. 101 ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈ рСкомСндация». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 19

Автор Π“Π΅Ρ€Π± Π‘Π°Ρ‚Ρ‚Π΅Ρ€

β€’ ΠœΠ΅Π½ΡŒΡˆΠ΅ странностСй. НаслСдованиС ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ поиска ΠΈΠΌΠ΅Π½ срСди Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ шаблонов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ пространствС ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ упомянутый Ρ‚ΠΈΠΏ. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ с Ρ‚Ρ€ΡƒΠ΄ΠΎΠΌ поддаСтся ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ (см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 58).

β€’ Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎΡΡ‚ΡŒ. НС всС классы ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Ρ€ΠΎΠ»ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 35). Однако Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ классов Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Ρ€ΠΎΠ»ΡŒΡŽ Ρ‡Π»Π΅Π½Π°.

β€’ Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. Π‘ΠΎΠ»Π΅Π΅ сильноС связываниС ΠΏΡƒΡ‚Π΅ΠΌ наслСдования затрудняСт написаниС бСзопасного Π² смыслС ошибок ΠΊΠΎΠ΄Π° (см. [Sutter02] Β§23).

β€’ ΠœΠ΅Π½ΡŒΡˆΠ°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Ρ…Ρ€ΡƒΠΏΠΊΠΎΡΡ‚ΡŒ. НаслСдованиС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ услоТнСниям, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ сокрытиС ΠΈΠΌΠ΅Π½ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс.

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

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС для модСлирования замСнимости (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 37).

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

β€’ Π•сли Π²Π°ΠΌ трСбуСтся ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

β€’ Π•сли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ доступ ΠΊ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΌΡƒ Ρ‡Π»Π΅Π½Ρƒ.

β€’ Π•сли Π²Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ, Π° ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ β€” послС, сдСлайтС Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом.

β€’ Π•сли Π²Π°ΠΌ приходится Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах.

β€’ Π•сли Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²Ρ‹Π³ΠΎΠ΄Ρƒ ΠΎΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ пустого Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈ Ρ‡Ρ‚ΠΎ Π² вашСм случаС ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π²Π°ΠΌΠΈ компилятором (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 8).

β€’ Π•сли Π²Π°ΠΌ трСбуСтся управляСмый ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, Ρ‚.Π΅. ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ замСнимости, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ (посрСдством Π΄Ρ€ΡƒΠΆΠ±Ρ‹).

Бсылки

[Cargill92] pp. 49-65, 101-105 β€’ [Cline99] Β§5.9-10, 8.11-12, 37.04 β€’ [Dewhurst03] Β§95 β€’ [Lakos96] Β§1.7, Β§6.3.1 β€’ [McConnell93] Β§5 β€’ [Meyers97] Β§40 β€’ [Stroustrup00] Β§24.2-3 β€’ [Sutter00] Β§22-24, Β§26-30 β€’ [Sutter02] Β§23

35. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ наслСдования ΠΎΡ‚ классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ спроСктированы для этой Ρ†Π΅Π»ΠΈ

РСзюмС

ΠšΠ»Π°ΡΡΡ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ использования, ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ проСктирования, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ» для Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 32). ИспользованиС Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… классов Π² качСствС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… являСтся ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΉ ошибкой проСктирования ΠΈ Π΅Π³ΠΎ слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Для добавлСния спСцифичСского повСдСния ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 44). Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ состояниС, вмСсто наслСдования слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 34). Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ наслСдования ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов.

ΠžΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅

ИспользованиС наслСдования Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΎ Π½Π΅ трСбуСтся, ΠΏΠΎΠ΄Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΊ ΠΌΠΎΡ‰ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π’ C++ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса слСдуСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ спСцифичСскиС дСйствия (см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ 32, 50 ΠΈ 54), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вСсьма сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ (Π° Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ просто ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹) ΠΎΡ‚ дСйствий ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ класса. НаслСдованиС ΠΎΡ‚ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ класса ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ваш ΠΊΠΎΠ΄ для массы ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ваш компилятор Π² состоянии Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… ΠΌΠ°Π»ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ.

ΠΠ°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ программисты Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ наслСдованиС ΠΎΡ‚ классов-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ класс string (стандартный ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ) просто Ρ‡Ρ‚ΠΎΠ±Ρ‹ "Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ большС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ". Однако ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ свободной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ) сущСствСнно прСвосходит созданиС класса super_string ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ.

β€’ Π‘Π²ΠΎΠ±ΠΎΠ΄Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ string. Если ΠΆΠ΅ вмСсто этого Π²Ρ‹ прСдоставляСтС класс super_string, Π²Π°ΠΌ придСтся Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² ваш ΠΊΠΎΠ΄, замСняя Ρ‚ΠΈΠΏΡ‹ ΠΈ сигнатуры Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

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

β€’ Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ super_string Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ больший доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ устройству класса string, Ρ‡Π΅ΠΌ свободныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс string, вСроятно, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… (protected) Ρ‡Π»Π΅Π½ΠΎΠ² (вспомнитС β€” этот класс Π½Π΅ прСдназначался для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ).

β€’ Π•сли класс super_string скрываСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса string (Π° ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС Π½Π΅ являСтся ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ β€” это просто сокрытиС), это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅Ρ€Π°Π·Π±Π΅Ρ€ΠΈΡ…Ρƒ Π² ΠΊΠΎΠ΄Π΅, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ string, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ автоматичСским ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ· класса super_string.

Π‘Π»ΠΎΠ²ΠΎΠΌ, Π»ΡƒΡ‡ΡˆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ посрСдством Π½ΠΎΠ²Ρ‹Ρ… свободных (Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 44). Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ поиска ΠΈΠΌΠ΅Π½, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ помСстили Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ пространство ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚ΠΈΠΏ, для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 57). НСкоторыС программисты Π½Π΅ Π»ΡŽΠ±ΡΡ‚ свободныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ·-Π·Π° ΠΈΡ… синтаксиса Fun(str) вмСсто str.Fun(), Π½ΠΎ это Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ вопрос ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠΈ.

Но Ρ‡Ρ‚ΠΎ Ссли класс super_string наслСдуСтся ΠΈΠ· класса string для добавлСния состояний, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ количСства слов? ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС Π½Π΅ рСкомСндуСтся ΠΈ Π² этом случаС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс string Π½Π΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ ΠΎΡ‚ срСзки (см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 54), ΠΈ любоС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ super_string Π² string ΠΌΠΎΠ»Ρ‡Π° ΡƒΠ±Π΅Ρ€Π΅Ρ‚ всС ΡΡ‚Π°Ρ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ состояния.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1. ΠšΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡ вмСсто ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ наслСдования. Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΈΠΏ lосаlized_string, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ "ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ string, Π½ΠΎ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ функциями ΠΈ нСбольшими ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»ΠΊΠ°ΠΌΠΈ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² string", ΠΈ ΠΏΡ€ΠΈ этом рСализация ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ? Π’ этом случаС Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса string, Π½ΠΎ Π½Π΅ наслСдованиСм, Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ срСзку ΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅), ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса string, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ:

class localized_string {

public:

 // ... ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΡŒΡ‚Π΅ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ‚Π΅Ρ…

 // Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² string, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ

 // (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ insert, которая

 // Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ impl_.insert) ...

 void clear(); // ΠœΠ°ΡΠΊΠΈΡ€ΡƒΠ΅Ρ‚/пСрСопрСдСляСт clear()

 bool is_in_klingon() const; // добавляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

private:

 std::string impl_;

 // ... Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ...

};

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, β€” занятиС ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, Π½ΠΎ Π·Π°Ρ‚ΠΎ такая рСализация сущСствСнно Π»ΡƒΡ‡ΡˆΠ΅ ΠΈ бСзопаснСС, Ρ‡Π΅ΠΌ использованиС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ наслСдования.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. std::unary_function. Π₯отя класс std::unary_function Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½Π° самом Π΄Π΅Π»Π΅ ΠΎΠ½ создан для использования Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈ Π½Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ рассматриваСмой Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ. (Однако класс unary_function ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ дСструктора β€” см. Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΡŽ 50.)

Бсылки

[Dewhurst03] Β§70, Β§93 β€’ [Meyers97] Β§33 β€’ [Stroustrup00] Β§24.2-3, Β§25.2

36. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ прСдоставлСниС абстрактных интСрфСйсов

РСзюмС

Π’Ρ‹ Π»ΡŽΠ±ΠΈΡ‚Π΅ абстракционизм? АбстрактныС интСрфСйсы ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Π²Π°ΠΌ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ абстрагирования, Π½Π΅ вдаваясь Π² Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ управлСния состояниями. ΠŸΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ абстрактныС интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‚ абстрактныС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ.