Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrarea de laborator Nr.4
la Programarea n C++
Tema: Motenirea i compoziia
A efectuat:
A verificat:
Balan Mihaela
Chiinu, 2014
Scopul lucrrii:
studierea motenirii, avantajele i dezavantajele;
studierea compoziiei;
studierea regulilor de definire a motenirii i compoziiei;
studierea formelor de motenire;
studierea iniializatorilor;
principiul de substituie;
motenirea i compoziia ce s alegem.
Noiuni teoretice
Definirea i utilizarea motenirii:
Motenirea se desemneaz prin indicarea clasei de baz dup numele clasei derivate, dup
dou puncte. Ca de exemplu:
class Animal{
int NofLegs;
public:
void Say(){ cout<<!!!; }
};
class Dog: public Animal{ // motenirea
...
};
void main(){
Dog d;
d.Say();
}
Din exemplu se vede, c funcia i variabila, sunt definite n clasa Animal sunt importate i
pot fi utilizate de obiectul clasei Dog. Starea, ce complic percepia acestui mecanism, consta din
aceia c, clasa derivat poate sa-i defineasc comportamentul, primit n clasa de baz. (Struul i
pinguinul nu zboar, dei sunt psri, dar ornitoringul depune ou, dei este manifer). Ne vom
ntoarce la aceasta tem n urmtoarele lucrri de laborator.
Principiul de substituiei
Adugnd la cele relatate mai sus, putem spune c, motenirea presupune, c obiectul
clasei derivate poate fi utilizat n locul obiectului de baz:
void main(){
Animal *ptr = new Dog;
}
Din exemplu se vede c sunt indice la clasa de baz deci se ateapt utilizarea obiectului
de baz, dar, indicatorului i se atribuie obiectul derivatei.
Formele motenirii
n relaiile motenirii, C++ este un limbaj foarte bogat, aa cum exist cinci forme diferite
de motenire
Diferite forme de motenire sunt utilizate, pentru a modifica starea accesului pentru
variabilele membre clasei. De exemplu, la utilizarea motenirii nchise, toate care sunt accesibile
(deschise i protejate) variabilele clasei de baz devin nchise n derivare. Dar prin utilizarea
derivrii protejate protejate. Variabilele nchise a clasei de baz prin orice forma de derivare
devin inaccesibile. Mai mult ca att, metodele de motenire, se deosebesc prin aceia, c
motenirea deschis creeaz un subtip de date, adic exist principiul de substituie, dar protejata
i deschisa nu.
Compoziia
Compoziia reprezint nc un mecanism, legat de programarea orientat pe obiecte, care
reprezint relaia dintre obiecte, atunci cnd motenirea este relaia dintre clase.
Motenirea realizeaz relaia a fi is a . Dog este mamifer, iar mamiferul animal.
Compoziia realizeaz relaia de a conine has a . Automobilul conine motor i roi.
Definirea compoziiei
Cu adevrat compoziia este folosit foarte larg, aa cum variabilele ncorporate conin un
tip i sunt utilizate la definirea clasei. Dar la folosirea variabilelor ncorporate nu apar ntrebri,
ceia ce nu se poate spune despre clasele utilizatorilor. Definirea nu este grea, ns utilizarea
constructorilor creeaz probleme.
class Car{
Engine e;
};
Varianta 10
De creat clasa student, care are un nume, specialitate, anul de nvmnt i balul mediu.
Determinai funcia de definire, schimbare a datelor i comparare. Pentru sarcina cmpurilor
textuale se folosete operatorul new. Determinai constructorul, destructorul i alte funcii
necesare. Creai clasa grupa, care conine studeni (o cantitate nelimitat). Definii metodele de
adugare i eliminare a studenilor, determinarea balului mediu pe grup, constructorii,
destructorii i alte funcii necesare.
#include <iostream>
#include <process.h>
#include <conio.h>
#include <string.h>
using namespace std;
int N=0;
float media=0;
class Student {
char *name;
char *spec;
int year;
float med;
public:
Student () : name(NULL), spec(NULL), year(0), med(0) {}
Student (char *n, char*s, int year, float med) :
name(new char[strlen(n)+1]), spec(new char[strlen(s)+1]), year(year), med(med)
{
strcpy(name, n);
strcpy(spec, s);
}
Student (Student &obj) :
};
class Grupa: public Student {
Student S[50];
public:
Grupa ():S() {}
Grupa (Student *s) {
for (int i=0; i<N; i++)
S[i]=s[i];
}
Grupa (Grupa &obj) {
for (int i=0; i<N; i++)
S[i]=obj.S[i];
}
~Grupa () {}
friend istream & operator >> (istream &in, Grupa&obj) {
cout << "Introduceti informatie despre studenti:\n";
for (int i=0; i<N; i++) {
cout <<"\tNr."<<i+1<<endl;
in>>obj.S[i];
}
return in;
}
friend ostream & operator << (ostream &out, Grupa &obj) {
for (int i=0; i<N; i++) {
cout <<"\tNr."<<i+1<<endl;
out<<obj.S[i];
}
return out;
}
void bal_mediu () {
media=0;
for (int i=0; i<N; i++)
get_media(S[i]);
media=media/N;
cout<<"Media grupei: "<<media<<endl;
getch();
}
void adaugare_student() {
cout <<"\tNr."<<N<<endl;
adaugare(S[N-1]);
}
};
int
main () {
int c, x=1;
Grupa g;
cout <<"Introduceti nr. de studenti: ";
cin >>N;
system ("cls");
cin>>g;
while (x) {
system ("cls");
cout<<"1 - Afisarea informatiei despre studenti\n";
cout<<"2 - Media grupei\n";
cout<<"3 - Adaugarea unui student\n";
cout<<"4 - Stergerea ultimului student\n";
cout<<"0 - Iesire\n";
cin>>c;
switch (c) {
case 1: cout<<g; getch(); break;
case 2: g.bal_mediu(); break;
case 3: N++; g.adaugare_student(); break;
case 4: if (N==0) {cout<<"Nu mai sunt studenti"; getch(); break;}
N--; break;
case 0: x=0; break;
}
}
return 0;
}
Concluzie: Efectund aceast lucrare de laborator am acumulat cunotine noi la tema
Motenirea i compoziia. n cadrul programului am creat clasa Student cu variabile de tip real,
ntreg i caractere, am creat clasa Grupa cu funcii de a aduga, elimina i calculul mediei
studenilor. Efectund aceast lucrare de laborator am nsuit modul de lucru cu motenirea i
compoziia n C++.