ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ типизация

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠŸΡ€Π°Π²ΠΈΠ»Π° C++ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ унаслСдованный элСмСнт Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ΅ «Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ», Ρ‡Π΅ΠΌ Π² ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡΠ΅. НапримСр, Ρ‡Π»Π΅Π½, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлан Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ явного упоминания. Для бСзопасного выявлСния Ρ‚ΠΈΠΏΠ°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ ссылка Π½Π° Π½Π΅Π³ΠΎ, слуТит ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ динамичСского опрСдСлСния Ρ‚ΠΈΠΏΠ°… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ типизация (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Вопросы построСния наслСдствСнных ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΉ тСсно связаны с Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ (Π² ΡΠ·Ρ‹ΠΊΠ°Ρ… с ΡΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ использовании наслСдования формируСтся ΠΈ ΡΠΈΡΡ‚Π΅ΠΌΠ° Ρ‚ΠΈΠΏΠΎΠ².

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

Если ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ супСркласс ΠΊΠ°ΠΊ private, это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ, наслСдуя структуру ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ супСркласса, подкласс ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠΌ. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ супСркласса станут Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ подкласса, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ нСдоступны подклассам Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Π’ ΡΡ‚ΠΎΠΌ случаС подкласс ΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ нСсовмСстимыми интСрфСйсами с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Если ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ супСркласс protected, Ρ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ элСмСнты Ρ‚Π°ΠΊΠΎΠ³ΠΎ супСркласса станут Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ элСмСнтами подкласса. Однако, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° интСрфСйсы класса ΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡΠ° нСсовмСстимы.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ рассмотрСниС наслСдствСнной ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, связанной с Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌΠΈ Π² Π³Ρ€Π°Ρ„ичСской систСмС. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ объявлСния:

Circle C1;

SolidCircle SC1, SC2;

ΠŸΡ€ΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, А Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π’ Π² ΡΠ·Ρ‹ΠΊΠ΅ Π‘++ допустимо, Ссли Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π’ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ с Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, А ΠΈΠ»ΠΈ являСтся Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠΌ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ SolidCircle являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ подклассом Circle, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присваивания ΠΏΡ€Π°Π²ΠΎΠΌΠΎΡ‡Π΅Π½:

C1 = SC1;

Π₯отя ΠΎΠ½ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½, Π½ΠΎ ΠΎΠΏΠ°ΡΠ΅Π½: Π»ΡŽΠ±Ρ‹Π΅ дополнСния Π² ΡΠΎΡΡ‚оянии подкласса ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΡΠΎΡΡ‚ояниСм супСркласса ΡΡ€Π΅Π·Π°ΡŽΡ‚ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ fillcol, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ΅ SolidCircle, Π±ΡƒΠ΄Π΅Ρ‚ потСрян ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π³ΠΎ просто Π½Π΅ΠΊΡƒΠ΄Π° Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ класса Circle.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ нСдопустим:

SC2 = Π‘1; // ошибка ИзмСним описаниС класса SolidCircle Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

class SolidCircle: Circle{.. .};

Π’Π΅ΠΏΠ΅Ρ€ΡŒ супСркласс Circle ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ объявлСн Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, move (), нСдоступны ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ класс SolidCircle Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠΎΠΌ Circle, ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ экзСмпляры подкласса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ супСркласса, ΠΊΠ°ΠΊ Π² ΡΠ»ΡƒΡ‡Π°Π΅ объявлСния супСркласса Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ.

Π‘1 = SC1; // Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ нСльзя ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ унаслСдованной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡΠ΅, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ доступа Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ явной ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

class SolidCircle: Circle{.

public:

.. .

Circle: move;

};

ΠŸΡ€Π°Π²ΠΈΠ»Π° C++ Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ унаслСдованный элСмСнт Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ΅ «Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ», Ρ‡Π΅ΠΌ Π² ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡΠ΅. НапримСр, Ρ‡Π»Π΅Π½, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π² ΡΡƒΠΏΠ΅Ρ€ΠΊΠ»Π°ΡΡΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлан Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ явного упоминания.

Π‘ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ связан особый Ρ‚ΠΈΠΏ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° — Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (чистый ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ). Π”Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° рСализуСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (ссылок) Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ наслСдовании ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всСх подклассов. Если Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°Ρ…, Ρ‚ΠΎ Π²Ρ‹Π±ΠΎΡ€, ΠΊΠ°ΠΊΡƒΡŽ Π΅Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, опрСдСляСтся с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ выяснСния ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠ° Π½Π° ΡΡ‚Π°ΠΏΠ΅ выполнСния. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция вызываСтся Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ Π½Π΅ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° указатСля, Π° ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Данная ситуация называСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΏΠΎΠ·Π΄Π½Π΅Π³ΠΎ связывания.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. ОпишСм Π½Π°ΡΠ»Π΅Π΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ.

class One {.

public:virtual f (){return 1;}.

};

class Two: public One {.

public:virtual f (){return 2;}.

};

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

One one, *p;

Two two;

.. .

p = &one; p -> f (); // Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° One, f () Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ 1.

p = &two; p -> f (); // Ρ€ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Two, f () Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ 2.

one.f (); // f () Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ 1.

one = two; one. f (); // one — ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° One, f () Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ 1.

Π‘ Π΄ΡƒΠ³ΠΎΠΉ стороны, Ссли Π±Ρ‹ функция f () Π½Π΅ Π±Ρ‹Π»Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ, Ρ‚ΠΎ Π΅Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π² ΠΎΠ±ΠΎΠΈΡ… классах Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Π° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ, ΠΈ Π²ΠΎ Π²ΡΠ΅Ρ… случаях Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΎΡΡŒ Π±Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1.

Для бСзопасного выявлСния Ρ‚ΠΈΠΏΠ°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса ΠΈΠ»ΠΈ ссылка Π½Π° Π½Π΅Π³ΠΎ, слуТит ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ динамичСского опрСдСлСния Ρ‚ΠΈΠΏΠ°, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² ΡΠ·Ρ‹ΠΊ Π‘++.

Одним ΠΈΠ· ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ привСдСния dynamic_cast. Рассмотрим случай с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ.

dynamic_cast (p);

Рассмотрим ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΊ Ρ‚ΠΈΠΏΡƒ родитСля, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ называСтся ΠΏΠΎΠ²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Π’ΠΎ Π²Ρ€Π΅ΠΌΡ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ опрСдСляСтся Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€. Если Ρ€ Ρ‚ΠΈΠΏΠ° Π’ype* ΠΈΠ»ΠΈ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс для Π’ype, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ простом присваивании Ρ€ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Ρ‚ΠΈΠΏΠ° Π’ype*. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возвращаСтся Π½ΡƒΠ»ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. Π’ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Circle — Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс класс для SolidCircle, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°:

Shape *S;

Circle *C;

SolidCircle *SΠ‘;

.. .

  • S = Π‘; // ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ
  • S = dynamic_cast (Π‘); // эквивалСнтно ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ
  • S = dynamic_cast (SΠ‘); // ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, возвратится 0
  • S = SΠ‘; // ошибка

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ родитСля ΠΊ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° называСтся ΠΏΠΎΠ½ΠΈΠΆΠ°ΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ. Оно примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΊΠ»Π°ΡΡΠ°ΠΌ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Ρ‚ΠΈΠΏ Ρ€ — Π’ype* ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ‚ΠΈΠΏ, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠ½Π°Ρ‡Π΅ возвращаСтся Π½ΡƒΠ»ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ΡΡΠ½ΡΡŽΡ‰ΡƒΡŽ, являСтся Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слуТит Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ.

bool isCircle (Shape* ptr){.

Circle* cptr = dynamic_cast (ptr);

return cptr ≠ 0;

}.

ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚:

Circle C;

Triangle T;

.. .

isCircle (&C); // true.

isCircle (&Π’); // false.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ