Alt linux Программирование на языке С++ в среде Qt Creator Е. Р. Алексеев, Г. Г. Злобин, Д. А. Костюк, О. В. Чеснокова, А. С. Чмыхало Москва alt linux 2015



Download 5,27 Mb.
Pdf ko'rish
bet131/193
Sana24.02.2022
Hajmi5,27 Mb.
#227496
1   ...   127   128   129   130   131   132   133   134   ...   193
Bog'liq
Book-qtC


Глава 10. Объектно-ориентированное программирование
Адрес виртуального метода известен только в момент выполнения програм-
мы. Когда происходит вызов виртуального метода, его адрес берётся из таблицы
виртуальных методов своего класса. Таким образом, вызывается то, что нужно.
Виртуальные методы описываются с помощью ключевого слова virtual в
базовом классе. Это означает, что в производном классе этот метод может быть
замещён методом, более подходящим для этого производного класса. Объявлен-
ный виртуальным в базовом классе, метод остаётся виртуальным для всех про-
изводных классов. Если в производном классе виртуальный метод не будет пере-
определён, то при вызове будет найден метод с таким именем вверх по иерархии
классов (т. е. в базовом классе).
#include 
#include 
using namespace s t d ;
c l a s s v e c t o r
{
protected :
double x , y ;
public :
v e c t o r ( double x , double y ) { this−>x=x ; this−>y=y ; }
v i r t u a l double abs ( ) { return s q r t ( x∗x + y∗y ) ; }
void i n f o ( ) { c o u t << "Модуль вектора равен " << abs ( ) << e n d l ; }
} ;
c l a s s s p a t i a l _ v e c t o r : public v e c t o r
{
protected :
double z ;
public :
s p a t i a l _ v e c t o r ( double x , double y , double z ) ;
double abs ( ) { return s q r t ( x∗x + y∗y + z ∗ z ) ; }
} ;
s p a t i a l _ v e c t o r : : s p a t i a l _ v e c t o r ( double x , double y , double z ) : v e c t o r ( x , y )
{
this
−>z=z ;
}
main ( )
{
c o u t << "Создаём вектор на плоскости с координатами 1,2\ n " ;
v e c t o r a ( 1 , 2 ) ;
a . i n f o ( ) ;
c o u t << "Создаём пространственный вектор с координатами 1,2,3\ n " ;
s p a t i a l _ v e c t o r b ( 1 , 2 , 3 ) ;
b . i n f o ( ) ;
}
Будучи выполнен, пример наконец выдаёт ожидаемый ответ:
Создаём вектор на плоскости с координатами 1,2
Модуль вектора равен 2.23607
Создаём пространственный вектор с координатами 1,2,3
Модуль вектора равен 3.74166
10.4.3
Множественное наследование
В списке базовых классов можно указывать несколько классов-родителей,
через запятую, каждого со своим модификатором наследования:
c l a s s A { . . . } ;
c l a s s B { . . . } ;
c l a s s C : public A, public B { . . . } ;
Программирование на языке С++ в среде Qt Creator


10.4. Наследование
299
При этом класс C унаследует как содержимое класса А, так и класса B. При
вызове конструктора будут сначала вызваны конструкторы базовых классов (в
порядке следования). Деструкторы, как всегда, имеют противоположный поря-
док вызова.
При множественном наследовании автоматически включается позднее связы-
вание.
10.4.4
Указатели на базовые классы
Другая сфера приложения виртуальных функций связана с использованием
указателей на объекты. Указатель, объявленный в качестве указателя на базо-
вый класс, также может использоваться как указатель на любой класс, произ-
водный от этого базового:
point * p = new vertex();
По указателю на объект базового класса можно вполне корректно вызвать те
методы класса-потомка, которые уже существовали в описании базового класса.
Вызвать по такому указателю метод, присутствующий лишь в производном
классе напрямую нельзя, но можно косвенно, с использованием приведения ти-
пов:
c l a s s p a r e n t
{
public :
void parent_method ( ) {}
} ;
c l a s s c h i l d : public p a r e n t
{
public :
void child_method ( ) {}
} ;
main ( )
{
p a r e n t ∗p = new c h i l d ( ) ;
p−>parent_method ( ) ;
( ( c h i l d ∗ ) p )−>child_method ( ) ;
}
Типичное использование указателя на базовый класс, которому присвоен ад-
рес объекта производного класса — хранение либо передача нескольких разно-
типных объектов, имеющих общий класс-предок. Например, во многих библио-
теках виджетов (графических элементов управления) инструментальная панель,
которая может содержать в себе кнопки, надписи, выпадающие списки и т. д.,
является универсальным контейнером, хранящим указатели на объект базового
класса (например, класса widget), от которого унаследованы конкретные эле-
менты управления (классы button, text, list и т. д.). Благодаря возможности
использовать указатель на базовый класс, панель реализует один единственный
набор методов для добавления и удаления разнотипных элементов, а также для
обращения к ним.
Однако при использовании указателей на базовый класс требуется соблюдать
осторожность в отношении разрушения объектов. Если объект-потомок выйдет
из области видимости и будет разрушен по указателю на базовый класс, то без
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.


300
Download 5,27 Mb.

Do'stlaringiz bilan baham:
1   ...   127   128   129   130   131   132   133   134   ...   193




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