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

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

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

Panda ying_yang("ying_yang");

print(ying_yang); // ошибка: Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ

Поиск Π½Π° основании Ρ‚ΠΈΠΏΠ° указатСля ΠΈΠ»ΠΈ ссылки

Как ΠΈ ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ наслСдовании, статичСский Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, указатСля ΠΈΠ»ΠΈ ссылки опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ класса ZooAnimal, для примСнСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² этом классС. Части интСрфСйса класса Panda, спСцифичСскиС для классов Bear, Panda ΠΈ Endangered, окаТутся нСдоступны. Аналогично ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылка Π½Π° класс Bear ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ классов Bear ΠΈ ZooAnimal, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ссылка Π½Π° класс Endangered ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ лишь Ρ‡Π»Π΅Π½Π°ΠΌΠΈ класса Endangered.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ эти классы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, пСрСчислСнныС Π² Ρ‚Π°Π±Π». 18.1.

Bear *pb = new Panda("ying_yang");

pb->print();     // ok: Panda::print()

pb->cuddle();    // ошибка: Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса Bear

pb->highlight(); // ошибка: Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса Bear

delete pb;       // ok: Panda::~Panda()

Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ указатСля ΠΈΠ»ΠΈ ссылки Π½Π° класс Endangered, части ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Panda, спСцифичСскиС для классов Panda ΠΈ Bear, становятся нСдоступными.

Endangered *Ρ€Π΅ = new Panda("ying_yang");

pe->print();     // ok: Panda::print()

pe->toes();      // ошибка: Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса Endangered

pe->cuddle();    // ошибка: Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса Endangered

pe->highlight(); // ok: Panda::highlight()

delete pe;       // ok: Panda::~Panda()


Π’Π°Π±Π»ΠΈΡ†Π° 18.1. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов ZooAnimal/Endangered

Ѐункция Класс, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ print() ZooAnimal::ZooAnimal Bear::Bear Endangered::Endangered Panda::Panda highlight Endangered::Endangered Panda::Panda toes Bear::Bear Panda::Panda cuddle Panda::Panda ДСструктор ZooAnimal::ZooAnimal Endangered::Endangered УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 18.3.2

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.23. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ ΠΈΠ· упраТнСния 18.22, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ класс D ΠΈ c ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ наличия Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса стандартного конструктора, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ нСдопустимы (Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ)?

class D : public X, public Π‘ { ... };

D *pd = new D;

(a) X *px = pd; (b) A *pa = pd;

(с) B *pb = pd; (d) C *pc = pd;

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.24. Π’Ρ‹ΡˆΠ΅ прСдставлСна ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° класс Bear, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ², подразумСвая, Ρ‡Ρ‚ΠΎ вмСсто Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° класс ZooAnimal, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.25. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Π±Π°Π·ΠΎΠ²Ρ‹Ρ… класса, Base1 ΠΈ Base2, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция-Ρ‡Π»Π΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ print() ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ дСструктор. ΠžΡ‚ этих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ классы, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция print().

class D1 : public Base1 { /* ... */ };

class D2 : public Base2 { /* ... */ };

class MI : public D1, public D2 {/* ... */ };

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ опрСдСлСния, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅, какая ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅:

Base1 *pb1 = new MI;

Base2 *pb2 = new MI;

D1 *pd1 = new MI;

D2 *pd2 = new MI;

(a) pb1->print(); (b) pd1->print(); (c) pd2->print();

(d) delete pb2;   (e) delete pd1;   (f) delete pd2;

18.3.3. ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости класса ΠΏΡ€ΠΈ мноТСствСнном наслСдовании

ΠŸΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ наслСдовании ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса вкладываСтся Π² ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΅Π³ΠΎ прямых ΠΈ косвСнных Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. Ρ€Π°Π·Π΄Π΅Π» 15.6). Поиск ΠΈΠΌΠ΅Π½ осущСствляСтся ΠΏΠΎ всСй ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ наслСдования. ИмСна, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ классС.

ΠŸΡ€ΠΈ мноТСствСнном наслСдовании поиск осущСствляСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²ΠΎ всСх прямых Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах. Если имя находится Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классах, происходит ошибка нСоднозначности.

Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ссли имя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ссылку ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Panda, Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Endangered ΠΈ Bear/ZooAnimal ΠΈΡΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. Если имя находится Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… иСрархиях, Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Для класса Π²ΠΏΠΎΠ»Π½Π΅ допустимо Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ‡Π»Π΅Π½ΠΎΠ² с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ. Но Ссли это имя Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, какая ΠΈΠΌΠ΅Π½Π½ΠΎ вСрсия имССтся Π² Π²ΠΈΠ΄Ρƒ.

Когда Ρƒ класса Π΅ΡΡ‚ΡŒ нСсколько Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ‡Π»Π΅Π½ ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΈ Π±ΠΎΠ»Π΅Π΅ своих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. ΠŸΡ€ΠΈ использовании этого ΠΈΠΌΠ΅Π½ΠΈ Π±Π΅Π· уточнСния класса происходит Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ.

НапримСр, Ссли классы ZooAnimal ΠΈ Endangered ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ max_weight(), Π° класс Panda Π½Π΅ опрСдСляСт Π΅Π΅, Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΎΡˆΠΈΠ±ΠΎΡ‡Π΅Π½:

double d = ying_yang.max_weight();

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ наслСдования класс Panda ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° max_weight(), Ρ‡Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ допустимо. НаслСдованиС создаСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Π•Π΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Panda Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ max_weight(). Ошибки Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, Ссли явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ZooAnimal::max_weight() ΠΈΠ»ΠΈ Endangered::max_weight(). Ошибка нСоднозначности ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· уточнСния.

ΠΠ΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ наслСдования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Π° max_weight Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π° ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½Π°. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π±Ρ‹, Π΄Π°ΠΆΠ΅ Ссли Ρƒ Π΄Π²ΡƒΡ… наслСдованных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ списки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ эта ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π±Ρ‹ Π΄Π°ΠΆΠ΅ Π² случаС, Ссли Π±Ρ‹ функция max_weight() Π±Ρ‹Π»Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ классС ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ссли Π±Ρ‹ функция max_weight() Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² классС Bear, Π° Π½Π΅ Π² классС ZooAnimal, Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² всС Ρ€Π°Π²Π½ΠΎ Π±Ρ‹Π» Π±Ρ‹ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π΅Π½.

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, поиск ΠΈΠΌΠ΅Π½ΠΈ осущСствляСтся ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ соотвСтствия Ρ‚ΠΈΠΏΠΎΠ² (см. Ρ€Π°Π·Π΄Π΅Π» 6.4.1). Когда компилятор Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ max_weight() Π² Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… областях видимости, ΠΎΠ½ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°Π΅Ρ‚ ΠΎΠ± ошибкС нСоднозначности.

ΠŸΡ€ΠΎΡ‰Π΅ всСго ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… нСоднозначностСй, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Π²Π΅Ρ€ΡΠΈΡŽ Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. НапримСр, снабдив класс Panda Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ max_weight(), ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ всС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

double Panda::max_weight() const {

 return std::max(ZooAnimal::max_weight(),

                 Endangered::max_weight());

}

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.26. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΊΠΎΠ΄Π° для ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print()? Π˜ΡΠΏΡ€Π°Π²ΡŒΡ‚Π΅ структуру MI Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ этот Π²Ρ‹Π·ΠΎΠ².

MI mi;

mi.print(42);

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.27. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΊΠΎΠ΄Π° для ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ ΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² структуру MI Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° привСдСнная Π½ΠΈΠΆΠ΅ функция foo(), ΠΎΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ вопросы:

int ival;

double dval;

void MI::foo(double cval) {

 int dval;

 // Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ вопросов упраТнСния Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ здСсь ...

}

(a) ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ всС ΠΈΠΌΠ΅Π½Π°, Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ MI::foo().

(b) Π’ΠΈΠ΄ΠΈΠΌΡ‹ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΈΠ· большС Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса?

(c) ΠŸΡ€ΠΈΡΠ²ΠΎΠΉΡ‚Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ экзСмпляру ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ dval сумму ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² dval ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов Base1 ΠΈ Derived.

(d) ΠŸΡ€ΠΈΡΠ²ΠΎΠΉΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго элСмСнта Π²Π΅ΠΊΡ‚ΠΎΡ€Π° MI::dvec ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ Base2::fval.

(e) ΠŸΡ€ΠΈΡΠ²ΠΎΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-Ρ‡Π»Π΅Π½Ρƒ cval класса Base1 ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ строки sval класса Derived.

Код для ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»Π° 18.3.3

struct Base1 {

 void print(int) const; // ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹

protected:

 int ival;

 double dval;

 char cval;

private:

 int *id;