Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_pz022 (1).doc
Скачиваний:
4
Добавлен:
29.08.2019
Размер:
239.62 Кб
Скачать

15.Множинне наслідування.

Приведення показчиків при множинному наслідуванні.

С

 

А В

 

L L

Неявні перетворення:

С*pc = newC;

L*pl ;

pl=pc ; //err! так як не зрозуміло до якого класу перетворювати

pl=(A*)pc ; // ok!

Pl=(L*)(A*)pc ; // ok!

Явні перетворення:

//"manageremployer"

// pm=(manager *)pl;

pc=pl ; // err!

a=(C*)pl ; //err!через неоднозначність

pc=(C*)(B*)pl ; //ok!

Усунення неоднозначності при визові ф-ій базового класу при множинному наслідуванні:

info{L,A,B,C}::f( );

info*C::f( )

{info*pi1=A::f( );

info*pi2=B::f( );

return merge(pi1,pi2);}

//info-інформація що повертає ф-ія,merge- злиття інформації

class employer

{ public : void f( );}

class manager:public

employer

{public : vod f( );}

void manager ::f( )

{ employer:: f( );

….};

Приклад змінної ієрархії:

class foreman :: public

employer

{ public : void f( );};

class manager:public

foreman

{ public : void f( );};

class foreman :public

employer

{ typedef employer

inherited;

public:

void f ( )

{interited :: f( );

……}};

class manager:public foreman

{ typedef employer

inherited;

public:

void f ( )

{interited :: f( );

……}};

interited введений для того щоб коли додасться ще один клас можна було змінити лише foreman

16.Віртуальні базові класи.

V

 

V A B

  

DC

Virtual -фактичний

class A:public virtual V;

class A:public virtual V;

class A:public virtual V;

Віртуальні базові класи потрібні для того щоб можна було спільну інформацію для класів А і В розділяти не використовуючи

virtual .Це можна зробити так:

class A

{ friend class V ;};

class V

{ friend class A ;};

Або використати глобальні змінні.

Завдяки віртуальності можна добитися того щоб базовий клас входив один раз

17.Перевантаження функцій.

Для будь-якого типу Т,типи Т, constT,T& мають одну і ту саму мн-ну ініціалізуючих значень.

Int i; void f (int i) ;

Const int i; void f(int &i ); int f i –винекне помилка або не мож-ливість відрізнити.

Для будь-якого типу Т,типи Т&,const T&,volatile T& є різними.У ланцюжку наслідува-ння класів одне і те саме ім’я ф. в різних кл. не перевантажуєть-ся,а перекривається.

Class X1

{void f(int f);}

classX9:public X8

{void f(double);}

void q(X9*p)

{p->f(2);}

18.Перевантаження унарних операцій.

Перевантаження операцій:+,-,*,/,%,==,=, &&,...,new,delete.Не можна перевантажувати: .,.*,::, ?:,#,##.На перевантаження на-кладаються обмеження:

1.Не можна перевантажувати операції для не классових ти-пів.Треба щоб або операція була членом якогось кл.,або принайм-ні один операнд має класов тип.

2.Можна змінити ассоціативні-сть,приоритет,кількість операн-дів.

3.Ніяких обмежень на тип,який повертає перевантаження опера-цій,немає.

Унарні операції:

operator @( )передається через this;

operator @(X)не є членом кл.

Наприклад: ++,--

TElem operator++( );

TElem operator – (TElem,int);

T operator / ( );//Error

Операції =,[ ],-> мають бути не статичними функціями-членами.

Перевантаження.

Operator ( )(P1..PN)

Перевантаження [ ]

Class vector

Int *v;

Int count;

Public:

Int f operator[ ](int i)

{...return vc1..}

void f(vector v1)

{count<<v1[1];};

1,1[2]=3;

Асоціативний масив.

Class NameList

{struct TItem

{char *name;

int id;}

TItem *List; int size;

Public: int append (char*,int);

Int& operator[ ](char*); ...}

NameList NL;

Int code;

.................

code=NL[“Gates”];

NL[“Bock”]=777;

Int& operator(char*hm)

{int i;

for (i=0; i<size; i++)}

if(stramp (hm.List[i].name)==0)

break

if (i==size)

i=append(hm,0)

return List[i].id;}

Як перевантажити?

Int i;

Class c {int m;}

c a; c*pa;

pa->m=2;

cout<<pa->m;

class c class cptr

p ublic: {c*pa;public:

int m; c*operator->();

cptr(c*ptr)

{pc=ptr};}

c C;

cptr P=&C

. . . . . . . . .

P->m=2;//(p.operator-> //( ))->m=2

Cout<<p->m<<endl;

c*cptr::operator->( )

{//......

return pc;}

19.Перевантаженя бінарних операцій.

Перевантаження операцій:+,-,*, /,%,==,=, &&,...,new,delete.Не можна перевантажувати: .,.*,::, ?:,#,##.На перевантаження накладаються обмеження:

1.Не можна перевантажувати операції для не кл. типів.Треба щоб або операція була членом якогось кл.,або принаймні один операнд має кл. тип.

2.Можна змінити ассоціатив-ність,приоритет,кількість опера-ндів.

3.Ніяких обмежень на тип,який повертає перевантаження опера-цій,немає.

Бінарні операції.

X @ Y

Operator @(Y);член кл. (X*this)

Operator @(X,Y)

Int operator +(intx,int y)

{return x+y;}//error

class C

{public:

c operator +(c,double);

void f(c,b)

{c a;

a=b+1;//b.operator+ (1)

a=b+1.0;//a=::operator +(b,1.0)

a=b+1L;}//error

20.Параметирзація типів за допомогою шаблонів.

Шаблони кл.

template<Список пара метрів>

Class . . .{. . . }

template<class T>

class vector

{T*v; public: vector (int i);

T&operator[ ](int index);}

Vector<int>v1(10);

Vector<complex>v2 (30

Typedet vector<comp lex>cvec;

cvec v3(40);// v2 i v3 одного типу

v1[1]=7;

v2[3]=7;//треба мати конструк-тор.

v2[4]=v3[3];//побітове копіювання або перевантажити =class vector<shape*>;//попереджуюче оголошення.

vector<mindow> *current_widow;

class svector: public: vector<shape*>;

Еквівалентність шаблонних ти-пів. Якщо вони походять від од-ного шаблона і значення шаб-лонів співпадають.

template<

class bufer

{T v[i];

. . . . . . . . . }

bufer <char.10*2>b1;

bufer <int,20>b2;

bufer <chape.20>b3;

b3 i b2 еквівалентні.

21.Параметризація функції за допомогою шаблонів.

template <список форм пара-метрів>//оголошення.

template <class T>

void sort(vector<T>&)

void f(vector<complex>CV;

vector<int>iv)

{ sort(cv);//sort(vector <complex>&)

sort(iv);}//sort(vector<int>&)

Сумісне використання шаблон-них і нешаблонних функцій.

template<classT>

T max(T&xT&y)

{return x>y?x :y;}

void f(int a,int b,char c,char d)

{int e,char f;

c=max(a,b);//max(int&,

int&)

f=max(c,d);//max(char&,char&)

e=max(a,c);}//error

int max(int&,int&) // прототип.

Правило оголошення функції с шаблонами.

Якщо виклик ф. повністю спів-падає з прототипом,то відбуває-ться генерація.

Пошук шаблонної ф.,яку можна отримати з визовом. Робиться спроба шляхом неявних пере-творень пар-рів у визові ф-ції привести типи шаблоні до типів прототипі нешаблонної ф-ції. Шаблонній функції,приходиться зустрічатися серед формальних параметрів шаблонної функції.

template <class T>T x creator( ); //error

template <class f( )> void T//error

{T*a;....}

template<class T>

class c

{public:

void f( ){T x a;};}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]