};
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();