C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet121/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   117   118   119   120   121   122   123   124   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

15 


 218 
public: 
int& X() { return x; } // Ссылка на x 
String* Name() { return &y; } 
// Адрес y 
}; 
Каждый экземпляр 
Foo
выглядит примерно так, как показано на представленной ниже диаграмме 
(вообще говоря, все зависит от компилятора, но в большинстве компиляторов дело обстоит именно 
так): 
vtable
x
y
Foo*
x&
y*
Как правило, несколько первых байт занимает указатель на v-таблицу для класса данного объекта. За 
ним следуют переменные класса в порядке их объявления. Если вы получаете адрес переменной класса 
в виде ссылки или указателя, возникает указатель на середину объекта. 
Адреса базовых классов 
Наследование также может вызвать массу положительных эмоций. 
class A {...}; 
// 
Один базовый класс 
class B {...}; 
// 
Другой базовый класс 
class C : public A, public B {...};
// Множественное наследование 
При одиночном наследовании преобразование от 
derived*
к 
base*
(где 
base
— базовый, а 
derived
— производный класс) адрес остается прежним, даже если компилятор полагает, что тип изменился. 
При множественном наследовании дело обстоит несколько сложнее. 
C* c = new C; 
A* a = c; // 
Преобразование от производного к первому базовому классу 
B* b = c; // 
Преобразование от производного ко второму базовому классу 
cout << c << endl; 
cout << a << endl; 
cout << b << endl; 
Вроде бы все просто, но в действительности компилятор проделывает довольно-таки хитрый фокус. 
При преобразовании 
C*
к 
A*
указатель остается прежним. Однако при преобразовании 
C*
к 
B*
компилятор действительно изменяет адрес. Это связано с тем, как объект хранится в памяти 
(структура объектов зависит от компилятора, но сказанное относится ко всем компиляторам, с 
которыми я работал). 
A
B
C
C*, A*
B*
Компилятор строит объект в порядке появления базовых классов, за которыми следует производный 
класс. Когда компилятор преобразует 
C*
к 
A*
, он словно набрасывает черное покрывало на 
составляющие 
B
и 
C
и убеждает клиентский код, что тот имеет дело с самым настоящим 
A

A
A*(c)



Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   117   118   119   120   121   122   123   124   ...   144




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish