Основы работы в С++

Методическое пособие - Компьютеры, программирование

Другие методички по предмету Компьютеры, программирование

?очие, имя конструктора базового класса и соответствующие параметры сразу же после заголовка конструктора производного класса.

) Принцип подстановки утверждает, что если есть два класса А и В такие, что класс В является подклассом класса А (возможно, отстоя в иерархии на несколько ступеней), то мы должны иметь возможность подставить представителя класса В вместо представителя класса А в любой ситуации, причем без видимого эффекта.

) Самый большой недостаток наследования заключается в том, что оно легко нарушает один из базовых принципов ООП - инкапсуляцию. Это связано с тем, что фактически родительский класс определяет поведение дочернего класса, а это значит, что даже незначительное изменение в родительском классе может сильно сказаться на поведении класса-потомка. Плюс ко всему, повторное использование кода сильно затрудняется, если реализация родителя содержит аспекты несовместимые с задачами потомка. Как правило, чтобы выйти из такой ситуации необходимо провести глубокий рефакторинг кода, а это не всегда возможно.

Композиция объектов строится динамически за счет связывания одного объекта с другими. При таком подходе классы используются в соответствии с их интерфейсом. Что не нарушает инкапсуляцию. Использование единого интерфейса позволяет в дополнение к инкапсуляции получить преимущества полиморфизма. Т.е. во время выполнения программы возможно один объект заменить другим.

 

Лабораторная работа №5

Тема: Множественное наследование

 

Цели работы:

? изучение правил определения множественного наследования;

? изучение преимуществ и недостатков множественного наследования;

? проблем связанных с использованием множественного наследования;

? изучение решений проблем;

 

) Создать иерархии наследования: студент, сотрудник - практикант.

 

 

#includenamespace std;Student {mark;imya[20];fam[20];:Set_student (int mark, char *imya, char*fam)

{strcpy (this->imya, imya);(this->fam, fam);>mark=mark;

}show_1 () {<< "__"<< "="<<mark<<endl;<< "__"<< Imya=<<imya<<endl;<< "__"<< familiya=<<fam<<endl;};

};Worker {salary;stag;:Set_Worker (int salary, double stag) {>salary=salary;>stag=stag;

}show_2 () {<< "__"<< zarplata=<<salary<<endl;<< "__"<< stag=<<stag<<endl;}

};Practicant: public Student, public Worker

{char srok[20];ozenka;:set_practicant (char*srok, int ozenka)

{strcpy (this->srok, srok);>ozenka=ozenka;

}show_3 () {<< "__"<< srok=<<srok<<endl;<< "__"<< ozenk=<<ozenka<<endl;

}

};main() {s, w;. Set_student (1222, Kolya, kinim);.show_1 ();.set_practicant (11juli, 12);.show_3 ();<< "___"<<endl;. Set_Worker (12333,13);.show_2 ();.set_practicant (11avg, 12);.show_3 ();0;

}

2) Создать иерархии наследования: человек - студент, сотрудник - практикант.

 

 

#include

#include namespace std;chel

{:pol[20];(char *pol) {(this->pol, pol);

}set_pol (char*pol)

{strcpy (this->pol, pol);}show_pol(void) {<<pol<< endl;

};

};student:public chel

{:stip;imya[20];(char*imya, double stip, char*pol):chel(pol)

{(this->pol, pol);(this->imya, imya);>stip=stip;

}set_iz1 ()

{>stip=stip;(this->pol, pol);(this->imya, imya);

}show_01 (void)

{<<imya<<endl;

};

 

};worck:public chel {:zarp;stag[20];(char*stag, double zarp, char*pol):chel(pol)

{(this->pol, pol);(this->stag, stag);>zarp=zarp;

}set_z2 ()

{>zarp=zarp;(this->pol, pol);(this->stag, stag);

}show_02 (void)

{<<stag<<endl;

};

};pract: public worck {:ozen;srok[20];(double ozen, char*srok, char*stag, double zarp, char*pol):worck (stag, zarp, pol)

{strcpy (this->pol, pol);(this->stag, stag);>zarp=zarp;>ozen=ozen;(this->srok, srok);

}set_ss() {this->ozen=ozen;(this->srok, srok);(this->stag, stag);>zarp=zarp;(this->pol, pol);}show_ss3 (void)

{<<pol<<endl;

};

};main(void)

{stip;srok;a(pol);<< "________________chel<<endl;.show_pol();a1 (imya, stip, pol);<< "________________student<<endl;.show_01 ();a3 (stag, zarp, pol);<< "________________worck<<endl;.show_02 ();a2 (ozen, srok, stag, zarp, pol);<< "_________________pract<<endl;.show_ss3 ();(pause);0;

}

 

Контрольне вопросы

) При множественном наследовании производный класс получает атрибуты двух или более классов.

При использовании множественного наследования для порождения класса конструктор производного класса должен вызвать конструкторы всех базовых классов.

При порождении класса из производного класса вы создаете иерархию наследования (иерархию классов).

 

2)

 

) семантическая неопределенность часто совокупно представляется как Проблема ромба

отсутствует возможность явного многократного наследования от одного класса

порядок наследования изменяет семантику класса

Перекрытие имен функций - эта проблема есть как и в обычном наследовании, так и в множественном.

Перекрытие виртуальных функцій

Представление объекта в памяти

) Виртуа?льное насле?дование (англ. virtual inheritance) в языке программирования C++ - один из вариантов наследования, который нужен для решения некоторых проблем, порождаемых наличием возможности множественного наследования (особенно ромбовидного наследования), путем разрешения неоднозначности того, методы которого из суперклассов (непосредственных классов-предков) необходимо использовать. Оно при