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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΎΠ΅ руководство ΠΏΠΎ C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 20

Автор Π‘ΡŒΡΡ€Π½ Бтраустрап

};


typedef enclose::inner ei;

int ei::x = 1;


void enclose::inner::f(int i) {/*… */}

Подобно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρƒ друТСствСнная функция, опрСдСлСнная Π² Π΄Π°Π½Π½ΠΎΠΌ классС, находится Π² области видимости этого класса. Она подчиняСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ связывания ΠΈΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ (ΠΎΠ½ΠΈ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π²Ρ‹ΡˆΠ΅ ΠΈ Π² Β§R.10.4), ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ особых ΠΏΡ€Π°Π² доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅Π³ΠΎ класса ΠΈ ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ этого класса (Β§R.11).

R.9.8 Описания Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… классов

Класс ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΎΠΉ класс называСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ. Имя локального класса считаСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π² ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅ΠΉ области видимости, Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости локального класса являСтся ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости. Π’ описаниях локального класса ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅ΠΉ области видимости ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ², статичСских ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ элСмСнты пСрСчислСния. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

int x;

void f()

{

 static int s;

 int x;

 extern int g();

 struct local {

  int h() { return x; } // ошибка: `x' автоматичСская

  int j() { return s; } // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

  int k() { return ::x; } // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

  int l() { return g(); } // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

 }

}

ΠžΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π°Ρ функция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ особых ΠΏΡ€Π°Π² доступа ΠΊ Ρ‡Π»Π΅Π½Π°ΠΌ локального класса, ΠΎΠ½Π° подчиняСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ доступа (Β§R.11). Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ-Ρ‡Π»Π΅Π½ локального класса слСдуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ этого класса. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ класс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ статичСских Ρ‡Π»Π΅Π½ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Π΅.

R.9.9 ИмСна Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²

ИмСна Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ областСй видимости, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°. Π’ частности, ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² описании класса, нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½Π΅ этого класса Π±Π΅Π· уточнСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class X {

public:

 typedef int I;

 class Y {/*… */}

 I a;

};


I b; // ошибка

Y c; // ошибка

X::Y d; // ошибка

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ контСкста ΠΏΡ€Π°Π²ΠΈΠ» описания Ρ‡Π»Π΅Π½ΠΎΠ² класса, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° пСрСноса Ρ‚Π΅Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ подстановками. ПослС использования Π² описании класса имя константы, имя-класса ΠΈΠ»ΠΈ имя-typedef Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π² описании этого класса. Имя, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΈΠΌΠ΅Π½Π΅ΠΌ-класса ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ-typedef Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² описании класса ΠΊΠ°ΠΊ имя-класса ΠΈΠ»ΠΈ имя-typedef, Ссли ΠΎΠ½ΠΎ ΡƒΠΆΠ΅ использовалось ΠΈΠ½Π°Ρ‡Π΅ Π² описании этого класса. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

typedef int c;

enum { i = 1 };

class X {

 char v[i];

 int f() { return sizeof(c); }

 char c; // ошибка: имя typedef

  // пСрСопрСдСляСтся послС использования

 enum { i = 2 }; // ошибка: `i' пСрСопрСдСляСтся послС

  // использования Π² Π·Π°Π΄Π°Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° `char[i]'

};


typedef char* T;


struct Y {

 T a;

 typedef long T; // ошибка: имя T ΡƒΠΆΠ΅ использовано

 T b;

};

R.10 ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ классы

Π’ описании класса ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ список Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… конструкций:

спСц-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…:

 : список-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…

список-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…:

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…

 ΡΠΏΠΈΡΠΎΠΊ-Π±Π°Π·ΠΎΠ²Ρ‹Ρ… , спСцификация-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…

спСцификация-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…:

 ΠΏΠΎΠ»Π½ΠΎΠ΅-имя-класса

 virtual спСцификация-доступа opt ΠΏΠΎΠ»Π½ΠΎΠ΅-имя-класса

 ΡΠΏΠ΅Ρ†ΠΈΡ„икация-доступа virtual opt ΠΏΠΎΠ»Π½ΠΎΠ΅-имя-класса

спСцификация-доступа:

 private

 protected

 public

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ имя-класса Π² спСцификации-Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅ описанный класс (Β§R.9), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ опрСдСляСмому классу. Говорят, Ρ‡Ρ‚ΠΎ класс являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ своих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. НазначСниС конструкции спСцификация-доступа ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² Β§R.11. К Ρ‡Π»Π΅Π½Π°ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π»Π΅Π½Π°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. Говорят, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс наслСдуСт Ρ‡Π»Π΅Π½Ρ‹ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ области видимости :: (Β§R.5.1) ΠΊ Ρ‡Π»Π΅Π½Ρƒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ явно. Π’Π°ΠΊΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° имя Ρ‡Π»Π΅Π½Π° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌ классС. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс сам ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ доступа, см. Β§R.11.2. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈ доступный Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс (Β§R.4.6). Бсылка Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ссылку Π½Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΈ доступный Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс (Β§R.4.7).

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class base {

 public:

 int a, b;

};


class derived: public base {

 public:

 int b, c;

};


void f()

{

 derived d;

 d.a = 1;

 d.base::b = 2;

 d.b = 3;

 d.c = 4;

 base* bp = &d; // стандартноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ derived* Π² base*

}

Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ значСния Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ d, Π° bp настраиваСтся Π½Π° d.

Класс называСтся прямым Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ, Ссли ΠΎΠ½ находится Π² спискС-Π±Π°Π·ΠΎΠ²Ρ‹Ρ…, ΠΈ косвСнным Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ, Ссли сам Π½Π΅ являясь прямым Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ, ΠΎΠ½ слуТит Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· классов списка-Π±Π°Π·ΠΎΠ²Ρ‹Ρ….

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ имя-класса :: имя конструкция, имя ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ‡Π»Π΅Π½Π° косвСнного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Π’Π°ΠΊΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ просто ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ класс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСдуСт Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ поиск этого ΠΈΠΌΠ΅Π½ΠΈ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class A { public: void f(); }

class B: public A {};

class C: public B { public: void f(); }


void C::f()

{

 f(); // Π²Ρ‹Π·ΠΎΠ² f() ΠΈΠ· C

 A::f(); // Π²Ρ‹Π·ΠΎΠ² f() ΠΈΠ· A

 B::f(); // Π²Ρ‹Π·ΠΎΠ² f() ΠΈΠ· A

}

Π—Π΄Π΅ΡΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹ вызываСтся A::f(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это СдинствСнная функция f() Π² классС B.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы, задаСтся Π² конструкторах, см. Β§R.12.6.2.

R.10.1 ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы

Класс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ числу Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class A {/*… */};

class B {/*… */};

class C {/*… */};

class D: public A, public B, public C {/*… */};

ИспользованиС Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ прямого Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса называСтся мноТСствСнным наслСдованиСм.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ наслСдования Π½Π΅ Π²Π°ΠΆΠ΅Π½, Ссли Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ вопросов, связанных со стандартной ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора (Β§R.12.1), ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (Β§R.12.4) ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ Π² памяти ($$r.5.4, Β§R.9.2, Β§R.11.1). ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ выдСлСния памяти для Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов опрСдСляСтся Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

НСльзя ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ класс Π² качСствС прямого Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΌΡƒ классу Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°, Π½ΠΎ косвСнным Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ.

class B {/*… */};

class D: public B, public B {/*… */}; // нСдопустимо


class L {/*… */};

class A: public L {/*… */};

class B: public L {/*… */};

class C: public A, public B {/*… */}; // Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ

Π—Π΄Π΅ΡΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса C Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса L.

К спСцификации Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ слуТСбноС слово virtual. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса V раздСляСтся ΠΌΠ΅ΠΆΠ΄Ρƒ всСми Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ классами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Π»ΠΈ V ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ своих Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class V {/*… */};

class A: virtual public V {/*… */};

class B: virtual public V {/*… */};

class C: public A, public B {/*… */};

Π—Π΄Π΅ΡΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса C Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса V.

Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class B {/*… */};

class X: virtual public B {/*… */};

class Y: virtual public B {/*… */};

class Z: public B {/*… */};

class AA: public X, public Y, public Z {/*… */};

Π—Π΄Π΅ΡΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса AA Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса B: ΠΈΠ· класса Z ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ, раздСляСмый ΠΌΠ΅ΠΆΠ΄Ρƒ классами X ΠΈ Y.

R.10.1.1 НСоднозначности

Доступ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ классу Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ. Доступ ΠΊ Ρ‡Π»Π΅Π½Ρƒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса считаСтся Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для доступа, Π·Π°Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΈΠΏΠ° ΠΈΠ»ΠΈ элСмСнта пСрСчислСния. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ происходит Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ возмоТности доступа (Β§R.11). ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class A {

public:

 int a;

 int (*b)();

 int f();

 int f(int);

 int g();

};


class B {

 int a;

 int b();

public:

 int f();

 int g();

 int h();