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

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

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

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

namespace NS {

 class Quote { /* ... */ };

 void display(const Quote&) { /* ... */ }

}

// Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Bulk_item объявлСн Π² пространствС ΠΈΠΌΠ΅Π½ NS

class Bulk_item : public NS::Quote { /* ... */ };

int main() {

 Bulk_item book1;

 display(book1);

 return 0;

}

АргумСнт book1 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ display() ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ класса Bulk_item. Ѐункциями-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°ΠΌΠΈ для этого Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ display() Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с объявлСниями, Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π°, Π½ΠΎ ΠΈ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² пространствС ΠΈΠΌΠ΅Π½ класса Bulk_item ΠΈ Π΅Π³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Quote. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, функция display(const Quote&), объявлСнная Π² пространствС ΠΈΠΌΠ΅Π½ NS, Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ².

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ объявлСния using

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡΠ½ΠΈΡ‚ΡŒ взаимодСйствиС объявлСний using ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ объявлСниС using ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ имя, Π° Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (см. Ρ€Π°Π·Π΄Π΅Π» 15.6):

using NS::print(int); // ошибка: нСльзя ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ список ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

using NS::print;      // ok: Π² объявлСнии using ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½Π°

Когда объявлСниС using ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, всС вСрсии этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСводятся Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости.

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

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, прСдоставлСнныС объявлСниСм using, ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ объявлСния ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΡƒΠΆΠ΅ находящихся Π² Π΄Π°Π½Π½ΠΎΠΉ области видимости.

Если объявлСниС using располоТСно Π² локальной области видимости, эти ΠΈΠΌΠ΅Π½Π° ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ объявлСния для Ρ‚ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π²ΠΎ внСшнСй области видимости. Если объявлСниС using Π²Π²ΠΎΠ΄ΠΈΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ функция с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ списком ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², объявлСниС using окаТСтся ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ΠΌ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС объявлСниС using создаст Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ экзСмпляр Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² увСличится.

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Ρ‡Π»Π΅Π½Ρ‹ пространства ΠΈΠΌΠ΅Π½ Π² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. Если имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пространства ΠΈΠΌΠ΅Π½ совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠΉ области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ пространство ΠΈΠΌΠ΅Π½, эта функция Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

namespace libs_R_us {

 extern void print(int);

 extern void print(double);

}

// ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ объявлСниС

void print(const std::string &);

// Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° ΠΈΠΌΠ΅Π½Π° Π² Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² для Π²Ρ‹Π·ΠΎΠ²Π°

// Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print():

using namespace libs_R_us;

// ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°ΠΌΠΈ Π½Π° Π²Ρ‹Π·ΠΎΠ² print() Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

// print(int) from libs_R_us

// print(double) from libs_R_us

// print(const std::string &) declared explicitly

void fooBar(int ival) {

 print("Value: "); // Π²Ρ‹Π·ΠΎΠ² глобальной print(const string &)

 print(ival);      // Π²Ρ‹Π·ΠΎΠ² libs_R_us::print(int)

}

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ объявлСния using, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ошибки, Ссли Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° using прСдоставит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°ΠΌΠΈ using, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ссли Π½Π΅ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π΅Π· уточнСния, относится Π»ΠΈ ΠΎΠ½Π° ΠΊ пространству ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ области видимости.

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΡ€ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ… using

Если Π² ΠΊΠΎΠ΄Π΅ присутствуСт нСсколько Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² using, Ρ‡Π°ΡΡ‚ΡŒΡŽ Π½Π°Π±ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² станут ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ пространства ΠΈΠΌΠ΅Π½.

namespace AW {

 int print(int);

}

namespace Primer {

 double print(double);

}

// Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ using ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ…

// пространств ΠΈΠΌΠ΅Π½

using namespace AW;

using namespace Primer;

long double print(long double);

int main() {

 print(1);   // Π²Ρ‹Π·ΠΎΠ² AW::print(int)

 print(3.1); // Π²Ρ‹Π·ΠΎΠ² Primer::print(double)

 return 0;

}

Набор ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ print() Π² глобальной области видимости содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print(int), print(double) ΠΈ print(long double). ВсС ΠΎΠ½ΠΈ составят Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, рассматриваСмых ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print() Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(), Π΄Π°ΠΆΠ΅ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… областях видимости пространства ΠΈΠΌΠ΅Π½.

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

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 18.20. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Ссли ΠΎΠ½ΠΈ Π΅ΡΡ‚ΡŒ) ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compute(). ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Ρ‹ ΠΈ подходящиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Какая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² (Ссли Π΅ΡΡ‚ΡŒ) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ‚ΠΎΡ‡Π½ΠΎ соотвСтствовал ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ подходящСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ?

namespace primerLib {

 void compute();

 void compute(const void *);

}

using primerLib::compute;

void compute(int);

void compute(double, double = 3.4);

void compute(char*, char* = 0);

void f() {

 compute(0);

}

Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Π² случаС, Ссли объявлСния using Π±ΡƒΠ΄ΡƒΡ‚ располоТСны Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compute()? ΠžΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° Ρ‚Π΅ ΠΆΠ΅ вопросы, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ.

18.3. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ наслСдованиС

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС (multiple inheritance) β€” это ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ класс ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ нСпосрСдствСнно ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов (см. Ρ€Π°Π·Π΄Π΅Π» 15.2.2). ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ класс наслСдуСт свойства всСх своих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. НСсмотря Π½Π° простоту ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ достаточно ΠΌΠ½ΠΎΠ³ΠΎ слоТностСй ΠΊΠ°ΠΊ Π½Π° этапС проСктирования, Ρ‚Π°ΠΊ ΠΈ Π½Π° этапС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Для исслСдования мноТСствСнного наслСдования ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΈΠ· ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π°. Π–ΠΈΠ²ΠΎΡ‚Π½Ρ‹Π΅ располоТСны Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… уровнях абстракции. Π•ΡΡ‚ΡŒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Π΅, Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ling-ling (Π›ΠΈΠ½Π³-Π»ΠΈΠ½Π³), Mowgli (ΠœΠ°ΡƒΠ³Π»ΠΈ) ΠΈ Balou (Π‘Π°Π»Ρƒ). КаТдоС ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ отнСсти ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ; Π›ΠΈΠ½Π³-Π»ΠΈΠ½Π³, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, это гигантская ΠΏΠ°Π½Π΄Π°. Π’ΠΈΠ΄Ρ‹ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ относятся ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ сСмСйствам. Гигантская ΠΏΠ°Π½Π΄Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ сСмСйству ΠΌΠ΅Π΄Π²Π΅Π΄Π΅ΠΉ, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сСмСйство являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ сообщСства ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ΠΎ ΠΌΠΈΡ€Π°.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции содСрТит Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ класс ZooAnimal ΠΊΠ°ΠΊ абстрактный, ΠΏΡ€ΠΈΠ·Π²Π°Π½Π½Ρ‹ΠΉ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая являСтся ΠΎΠ±Ρ‰Π΅ΠΉ для всСх ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ… ΠΈ прСдоставляСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ интСрфСйс. Класс Bear (МСдвСдь) Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, которая являСтся спСцифичСской для сСмСйства ΠΌΠ΅Π΄Π²Π΅Π΄Π΅ΠΉ, ΠΈ Ρ‚.Π΄.

ΠšΡ€ΠΎΠΌΠ΅ классов ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…, здСсь ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ абстракции, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‰ΠΈΡ…ΡΡ опасности. Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класс Panda (Панда) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ мноТСствСнного наслСдования ΠΎΡ‚ классов Bear ΠΈ Endangered (ΠŸΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‰ΠΈΠΉΡΡ опасности).

18.3.1. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС

Бписок наслСдования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСсколько Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов:

class Bear : public ZooAnimal { /* ... */ };

class Panda : public Bear, public Endangered { /* ... */ };

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ спСцификатор доступа (см. Ρ€Π°Π·Π΄Π΅Π» 15.5). Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли спСцификатор доступа отсутствуСт, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ подразумСваСтся спСцификатор private (Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ), Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово class, ΠΈ public (ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ), Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово struct (см. Ρ€Π°Π·Π΄Π΅Π» 15.5).

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