Lucrul cu moștenirea în C ++

În acest tutorial despre care vom vorbi moștenirea în C ++, un subiect foarte interesant, să-l vedem printr-un exemplu simplu. Pentru persoanele care se află pe Windows, puteți descărca un IDE pentru a programa, vă va ajuta să compilați și să rulați programele, lăsăm linkul de mai jos:

DEVC ++

Aici vom folosi Linux, în special Ubuntu, care are deja un compilator pentru C ++. Limbajul C ++, după cum probabil știe toată lumea, permite moștenirea multiplă, spre deosebire de Java, care permite doar moștenirea simplă și, dacă vrem ceva similar, trebuie să tragem interfețe, până la urmă este mai puțin predispus la erori.

Exemplul principal pe care îl vom arăta aici pentru a vedea moștenirea în C ++ este simplu, nu vom intra în moștenirea multiplă, cu excepția finalului pentru a arăta o eroare cu care putem fi afectați.

1. Moștenire simplă în C ++


Pentru a începe primul exemplu, moștenirea simplă, vom avea o clasă Animal, care va fi clasa de bază sau părintele nostru și 2 clase care vor moșteni, Câine care nu va avea niciun cod și Pisică care va adăuga un nou parametru clasei părinte. Să vedem codul (este scurt):
 #includeți utilizarea spațiului de nume std; clasa Animal {private: int age; public: Animal (int a = 1) {vârsta = a; }; int getAge () const {return age;} void setAge (int a = 9) {age = a; }}; clasa Câine: Animal public {}; clasa Cat: public Animal {privat: greutate plutitor; public: Cat (int a = 2, float w = 3.2): Animal (a) {greutate = w; } float getWeight () const {returnează greutatea;}}; int main () {Dog mastin; cout << "____DOG____" << endl; cout << "Înainte:" << mastin.getAge () << endl; mastin.setAge (2); cout << "After:" << mastin.getAge () << endl; Pisica miaună (3, 4.1); cout << "____CAT____" << endl; cout << meow.getAge () << "" << meow.getWeight () << endl; } 
Presupunem că știți deja unele C ++ pentru a continua să vedeți problemele legate de moștenire și, prin urmare, părțile funcțiilor sau părțile publice și private pe care nu le vom explica. Pentru a moșteni dintr-o clasă avem următoarea sintaxă:
 clasa fiică_clasă: publică părinte_clasă
Deci, în exemplul nostru pentru a crea clasa Câine am folosit:
 clasă Câine: Animal public
Indică faptul că Câine moștenește de la Animal, tot ce are clasa Animal în blocurile sale publice sau protejate îl putem folosi, totuși, dacă folosim blocul privat, vom primi o eroare. Clasa bună Câine este gol, deci nu are dificultăți majore.

Dacă mergem la curs Pisică, avem aceeași declarație de clasă ca înainte, în afară de aceasta vedem că adaugă o nouă variabilă greutate, această variabilă nu o are și nici clasa Animal, nici unul Câine. Aici, în constructorul clasei, am numit constructorul clasei părinte, astfel trecem datele pentru variabilă vârstă, și completăm și variabila greutate.

NotăPuteți vedea că parametrii pe care îi transmitem funcțiilor pot avea o valoare implicită.

În principal creăm un obiect al clasei Câine, lăsăm vârsta în mod implicit și o afișăm, apoi folosim funcția setAge pentru a schimba vârsta și a o arăta din nou. În cele din urmă, creăm un obiect al clasei Pisică, iar de data aceasta nu lăsăm variabilele să aibă o valoare implicită și le transmitem la crearea obiectului și, pentru a nu varia, le arătăm.

Dacă vrem rulați acest cod într-un terminal Linux cu g ++, facem următoarele:

 g ++ -o test tesc.gcc
Și pentru a rula foarte ușor:
 ./Test
Vom arăta o captură cu compilarea și executarea codului mic:

2. Moștenirea multiplă în C ++


Sa ii vedem pericolele moștenirii multiple vom lăsa un cod foarte mic:
 #includeți utilizarea spațiului de nume std; clasa Animal {public: void walk () {cout << "Walking in Animal" << endl; }}; clasa Mammal {public: void walk () {cout << "Walking in Mammal" << endl; }}; clasa Câine: Animal public, Mamifer public {}; int main () {Dog dog; dog.walk (); } 
Vedem asta Câine moștenește din Animal Da Mamifer, și ambele clase au aceeași funcție a merge, dacă folosesc funcția normală ca în cod:
 dog.walk ()
Și compilăm obținem următoarea eroare:

Pentru a o rezolva putem folosi următoarea sintaxă, pentru a apela funcția Animal:

 dog.Animal :: walk ();
sau pentru a folosi clasa Mamifer:
 dog.Mamifero :: walk ();
Și, bineînțeles, cea mai bună soluție este să nu avem 2 funcții cu același nume dacă vom folosi moștenirea multiplă, în acest program este foarte ușor să o rezolvăm, dar într-una mare poate deveni o durere de cap.

V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv
wave wave wave wave wave