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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 270

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Как ΠΈ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ наслСдовании, список наслСдования ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ final (см. Ρ€Π°Π·Π΄Π΅Π» 15.2.2). Π―Π·Ρ‹ΠΊ Π‘++ Π½Π΅ Π½Π°Π»Π°Π³Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° количСство Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс. Однако Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² спискС наслСдования Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

ΠŸΡ€ΠΈ мноТСствСнном наслСдовании классы Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ состояниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

ΠŸΡ€ΠΈ мноТСствСнном наслСдовании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· своих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. Ρ€Π°Π·Π΄Π΅Π» 15.2.2). НапримСр, Π½Π° рис. 18.2 Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Panda Π΅ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ класса Bear (которая сама содСрТит Ρ‡Π°ΡΡ‚ΡŒ ZooAnimal), Ρ‡Π°ΡΡ‚ΡŒ класса Endangered ΠΈ нСстатичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… класса Panda.

Рис. 18.2. ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ структура ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Panda

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ созданиС ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² всСх Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π’ случаС ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ наслСдования ΠΈΠ· (Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ) Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (см. Ρ€Π°Π·Π΄Π΅Π» 15.2.2) Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ значСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для прямых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов:

// явная инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ±ΠΎΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

Panda::Panda(std::string name, bool onExhibit)

 : Bear(name, onExhibit, "Panda"),

   Endangered(Endangered::critical) { }

// нСявноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ стандартного конструктора класса Bear для

// ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Panda::Panda()

 : Endangered(Endangered::critical) { }

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

β€’ Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ZooAnimal, самого ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ класса Panda, нСпосрСдствСнного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ для класса Bear создаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.

β€’ Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Bear, ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ нСпосрСдствСнного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса для класса Panda, инициализируСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ.

β€’ Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Endangered, Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ нСпосрСдствСнного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса для класса Panda, инициализируСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ.

β€’ ΠŸΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ инициализируСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ производная Ρ‡Π°ΡΡ‚ΡŒ класса Panda.

УнаслСдованныС конструкторы ΠΈ мноТСствСнноС наслСдованиС

По Π½ΠΎΠ²ΠΎΠΌΡƒ стандарту ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ свои конструкторы ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… своих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. Ρ€Π°Π·Π΄Π΅Π» 15.7.4). НСльзя Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ конструктор (Ρ‚.Π΅. конструктор с Ρ‚Π΅ΠΌ ΠΆΠ΅ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²) ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса:

struct Base1 {

 Base1() = default;

 Base1(const std::string&);

 Base1(std::shared_ptr<int>);

};

struct Base2 {

 Base2() = default;

 Base2(const std::string&);

 Base2(int);

};

// ошибка: D1 пытаСтся ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ D1::D1(const string&) ΠΎΡ‚ ΠΎΠ±ΠΎΠΈΡ…

// Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

struct D1: public Base1, public Base2 {

 using Base1::Base1; // наслСдуСт конструкторы ΠΎΡ‚ Base1

 using Base2::Base2; // наслСдуСт конструкторы ΠΎΡ‚ Base2

};

Класс, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π²ΡˆΠΈΠΉ Ρ‚ΠΎΡ‚ ΠΆΠ΅ конструктор ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ этого конструктора:

struct D2: public Base1, public Base2 {

 using Base1::Base1; // наслСдуСт конструкторы ΠΎΡ‚ Base1

 using Base2::Base2; // наслСдуСт конструкторы ΠΎΡ‚ Base2

 // D2 Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнный конструктор, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ string

 D2(const string &s) : Base1(s), Base2(s) { }

 D2() = default; // Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ D2 опрСдСляСт собствСнный

                 // конструктор

};

ДСструкторы ΠΈ мноТСствСнноС наслСдованиС

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, дСструктор Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° освобоТдСниС рСсурсов, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… этим классом. АвтоматичСски ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈ всСх Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π’Π΅Π»ΠΎ синтСзируСмого дСструктора пусто.

ДСструкторы всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Ρƒ конструкторов. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ порядок Π²Ρ‹Π·ΠΎΠ²Π° дСструкторов Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ: ~Panda(), ~Endangered(), ~Bear(), ~ZooAnimal().

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ копирования ΠΈ пСрСмСщСния ΠΏΡ€ΠΈ мноТСствСнном наслСдовании

Как ΠΈ Π² случаС ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ наслСдования, классы с нСсколькими Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ классами, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌΠΈ собствСнныС конструкторы копирования, пСрСмСщСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ присвоСния, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ вСсь ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (см. Ρ€Π°Π·Π΄Π΅Π» 15.7.2). Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ части класса, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ…, автоматичСски ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтСзируСмыС вСрсии этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ². Π’ синтСзируСмых функциях-Ρ‡Π»Π΅Π½Π°Ρ… управлСния ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс нСявно создаСтся, присваиваСтся ΠΈΠ»ΠΈ удаляСтся с использованиСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‡Π»Π΅Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.

НапримСр, Ссли класс Panda ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ синтСзируСмыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, Ρ‚ΠΎ инициализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ling_ling Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ конструктор ΠΊΠΎΠΏΠΈΠΉ класса Bear, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ конструктор ΠΊΠΎΠΏΠΈΠΉ класса ZooAnimal ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ конструктор ΠΊΠΎΠΏΠΈΠΉ класса Bear:

Panda ying_yang("ying_yang");

Panda ling_ling = ying_yang; // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ конструктор ΠΊΠΎΠΏΠΈΠΉ

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ Bear ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ling_ling создана, выполняСтся конструктор ΠΊΠΎΠΏΠΈΠΉ класса Endangered, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, выполняСтся конструктор ΠΊΠΎΠΏΠΈΠΉ класса Panda. Аналогично для синтСзируСмого конструктора пСрСмСщСния.

Π‘ΠΈΠ½Ρ‚Π΅Π·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΊΠΎΠΏΠΈΠΈ Π²Π΅Π΄Π΅Ρ‚ сСбя Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ конструктор ΠΊΠΎΠΏΠΈΠΉ. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½ присваиваСт Ρ‡Π°ΡΡ‚ΡŒ Bear (ΠΈ Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ZooAnimal) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π·Π°Ρ‚Π΅ΠΌ Ρ‡Π°ΡΡ‚ΡŒ Endangered ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ‡Π°ΡΡ‚ΡŒ Panda. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 18.3.1

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.21. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ объявлСния. НайдитС всС ошибки ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΠΈΡ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ:

(a) class CADVehicle : public CAD, Vehicle { ... };

(b) class DblList: public List, public List { ... };

(c) class iostream: public istream, public ostream { ... };

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.22. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ стандартный конструктор:

class A { ... };

class B : public A { ... };

class C : public B { ... };

class X { ... };

class Y { ... };

class Z : public X, public Y { ... };

class MI : public C, public Z { ... };

Каков порядок выполнСния конструкторов ΠΏΡ€ΠΈ создании ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°?

MI mi;

18.3.2. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ нСсколько Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов

ΠŸΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ наслСдовании ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылка Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылку Π½Π° Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс (см. Ρ€Π°Π·Π΄Π΅Π» 15.2.2 ΠΈ Ρ€Π°Π·Π΄Π΅Π» 15.5). Π­Ρ‚ΠΎ справСдливо ΠΈ для мноТСствСнного наслСдования. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылка Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылку Π½Π° любой ΠΈΠ· Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. НапримСр, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылка Π½Π° класс ZooAnimal, Bear ΠΈΠ»ΠΈ Endangered ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda.

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ссылки Π½Π° класс, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ для класса Panda

void print(const Bear&);

void highlight(const Endangered&);

ostream& operator<<(ostream&, const ZooAnimal&);

Panda ying_yang("ying_yang");

print(ying_yang);          // ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda ΠΊΠ°ΠΊ

                           // ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Bear

highlight(ying_yang);      // ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda ΠΊΠ°ΠΊ

                           // ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Endangered

cout << ying_yang << endl; // ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda ΠΊΠ°ΠΊ

                           // ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса ZooAnimal

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π΄Π°ΠΆΠ΅ Π½Π΅ пытаСтся ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов происходят ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print():

void print(const Bear&);

void print(const Endangered&);

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print() Π±Π΅Π· ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Panda ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС Π²ΠΎ врСмя выполнСния.