Pentru ce funcții virtuale sunt necesare, programarea pe c și c

Așa cum am menționat mai devreme, funcțiile virtuale în combinație cu tipurile derivate permit limbajului C ++ să susțină polimorfismul de execuție. Acest polimorfism este important pentru programarea orientată pe obiecte, deoarece vă permite să redefiniți funcțiile clasei de bază în clasele copil, pentru ca versiunea lor să fie aplicată acestei clase. Astfel, clasa de bază definește o interfață comună pe care toate clasele derivate din ea au, și în același timp, polimorfismul permite claselor derivate să aibă propria implementare a metodelor. Datorită acestui polimorfism este deseori definită de expresia "o interfață - multe metode".







Aplicarea cu succes a polimorfismului implică înțelegerea faptului că clasele de bază și cele derivate formează o ierarhie în care tranziția de la clasa de bază la clasa derivată corespunde unei tranziții de la o generalitate mai mare la o mai mică. Prin urmare, atunci când este folosit corect, clasa de bază oferă toate elementele pe care clasele derivate le pot folosi direct, plus un set de funcții pe care clasele derivate trebuie să le implementeze prin suprimarea lor.

Prezența unei interfețe comune și a implementării sale multiple este importantă în măsura în care ajută programatorii să dezvolte programe complexe. De exemplu, accesul la toate obiectele derivate dintr-o anumită clasă de bază se face în același mod, chiar dacă acțiunile reale ale acestor obiecte diferă atunci când se deplasează de la o clasă derivată la alta. Aceasta înseamnă că trebuie să vă amintiți doar o interfață, nu doar câteva. În plus, separarea interfeței de implementare vă permite să creați biblioteci de clase furnizate de dezvoltatori independenți. Dacă aceste biblioteci sunt implementate corect,
ele oferă o interfață comună și pot fi utilizate pentru a-și putea scoate propriile clase specifice.

Pentru a înțelege puterea ideii "o interfață - multe metode", luați în considerare următorul program scurt. Creează cifra de clasă de bază. Această clasă este utilizată pentru a stoca dimensiunile diferitelor obiecte bidimensionale și pentru a calcula zonele lor. Funcția set_dim () este o funcție standard a membrului, deoarece acțiunile sale sunt comune tuturor claselor derivate. Cu toate acestea, funcția show_area () este declarată ca o funcție virtuală, deoarece modul de calcul al zonei fiecărui obiect este specific. Programul utilizează clasa figura pentru a scoate două clase specifice, pătrate și triunghi.







#include
figura clasei protejate:
dublu x, y;
publice:
void set_dim (dublu i, dublu j) x = i;
y = j;
>
virtual void show_area () cout <<"No area computation defined ";
cout <<"for this class. \n";
>
>;
triunghi triunghi: figura publică public:
void show_area () cout <<"Triangle with height ";
cout < cout <<" has an area of ";
cout <>
>;
clasa pătrat: public figura public:
void show_area () cout <<"Square with dimensions ";
cout < cout <<" has an area of ";
cout <>
>;
int main ()
figura * p; / * a crea un pointer de tip de bază * /
triunghi t; / * crearea de obiecte de tipuri generate * /
pătrate s;
p = t;
p-> set_dim (10,0, 5,0);
p-> show_area ();
p = s;
p-> set_dim (10,0, 5,0);
p-> show_area ();
retur 0;
>

cerc de clasă: figura publică public:
void show_area () cout <<"Circle with radius ";
cout < cout <<"has an area of ";
cout <<3.14 * x * x;
>
>;

Înainte de a folosi cercul de clasă, să examinăm îndeaproape definiția funcției show_area (). Rețineți că utilizează numai valoarea lui x, care exprimă radixul. După cum știți, aria cercului se calculează prin formula π R2. Cu toate acestea, funcția set_dim (), definită în clasa figura, nu necesită un singur argument decât două. Deoarece cercul de clasă nu are nevoie de a doua valoare, cum putem fi în această situație?

Există două modalități de a rezolva această problemă. Primul este de a apela set_dim (), folosind un parametru inactiv ca al doilea parametru, care nu va fi folosit. Dezavantajul acestei abordări este necesitatea de a ne aminti acest caz excepțional, care, în esență, încalcă principiul "o interfață - multe metode".

Cea mai bună soluție la această problemă este folosirea parametrului y din set_dim () cu valoarea implicită. În acest caz, atunci când apelați set_dim () pentru un cerc, trebuie doar să specificați raza. Când sunați set_dim () pentru un triunghi sau dreptunghi, indicăm ambele cantități. Mai jos este un program care implementează această abordare:

#include
figura clasei protejate:
dublu x, y;
publice:
void set_dim (dublu i, dublu j = 0) x = i;
y = j;
>
virtual void show_area () cout <<"No area computation defined ";
cout <<"for this class .\n";
>
>;
triunghi triunghi: figura publică public:
void show_area () cout <<"Triangle with height ";
cout < cout <<" has an area of ";
cout <>
>;
clasa pătrat: public figura public:
void show_area () cout <<"Square with dimensions ";
cout < cout <<" has an area of ";
cout <>
>;
cerc de clasă: figura publică public:
void show_area () cout <<"Circle with radius ";
cout < cout < cout <<3.14 * x * x;
>
>;
int main ()
figura * p; / * a crea un pointer de tip de bază * /
triunghi t; / * crearea de obiecte de tipuri generate * /
pătrate s;
cerc cu;
p = t;
p-> set_dim (10,0, 5,0);
p-> show_area ();
p = s;
p-> set_dim (10,0, 5,0);
p-> show_area ();
p = c;
p-> set_dim (9.0);
p-> show_area ();
retur 0;
>

Acest exemplu arată, de asemenea, că în determinarea clasei de bază este important să se arate flexibilitatea maximă posibilă. Nu impuneți nici o restricție inutilă asupra programului.







Articole similare

Trimiteți-le prietenilor: