Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-is-ab:laboratoare:12 [2025/01/11 12:24]
razvan.cristea0106 [Rezolvarea Problemei Rombului]
poo-is-ab:laboratoare:12 [2025/12/12 20:40] (current)
razvan.cristea0106 [Rezolvarea Problemei Rombului]
Line 31: Line 31:
 ==== Rezolvarea Problemei Rombului ==== ==== Rezolvarea Problemei Rombului ====
  
-Pentru a putea gestiona și rezolva corect această problemă trebuie să aplicăm doi pași si anume: **derivarea ​virtuala ​a claselor intermediare din clasa de baza** și respectiv **apelarea constructorilor clasei de bază în lista de inițializare a constructorilor clasei nepot**. Pentru a vedea dacă aplicația se comportă în conformitate cu așteptările pe care le avem va trebui să o testăm constant pentru a vedea dacă am eliminat toate ambiguitățile generate de problema rombului.+Pentru a putea gestiona și rezolva corect această problemă trebuie să aplicăm doi pași si anume: **derivarea ​virtuală ​a claselor intermediare din clasa de bază** și respectiv **apelarea constructorilor clasei de bază în lista de inițializare a constructorilor clasei nepot**. Pentru a vedea dacă aplicația se comportă în conformitate cu așteptările pe care le avem va trebui să o testăm constant pentru a vedea dacă am eliminat toate ambiguitățile generate de problema rombului.
  
 === Derivarea virtuală === === Derivarea virtuală ===
Line 42: Line 42:
 public: public:
  
-    A() +    A()
     {     {
         std::cout << "​Constructor A\n";         std::cout << "​Constructor A\n";
     }     }
  
-    ~A() +    ~A()
     {     {
         std::cout << "​Destructor A\n";         std::cout << "​Destructor A\n";
Line 53: Line 53:
 }; };
  
-class B : public A +class B : public A
 { {
 public: public:
Line 62: Line 62:
     }     }
  
-    ~B() +    ~B()
     {     {
         std::cout << "​Destructor B\n";         std::cout << "​Destructor B\n";
Line 68: Line 68:
 }; };
  
-class C : public A +class C : public A
 { {
 public: public:
Line 77: Line 77:
     }     }
  
-    ~C() +    ~C()
     {     {
         std::cout << "​Destructor C\n";         std::cout << "​Destructor C\n";
Line 83: Line 83:
 }; };
  
-class D : public B, public C +class D : public B, public C
 { {
 public: public:
Line 92: Line 92:
     }     }
  
-    ~D() +    ~D()
     {     {
         std::cout << "​Destructor D\n";         std::cout << "​Destructor D\n";
Line 104: Line 104:
 #include <​iostream>​ #include <​iostream>​
  
-int main() ​+int main()
 { {
     D obj;     D obj;
Line 132: Line 132:
 <note warning>​Comportamentul descris mai sus apare din cauza **problemei rombului**, care generează o **ambiguitate** ce conduce la **dublul apel** al constructorului și al destructorului clasei de bază **A**. Această situație poate deveni problematică în special în scenariile în care superclasa **A** gestionează resurse **alocate dinamic**. În astfel de cazuri, **ambiguitatea** poate duce la **comportament nedefinit**,​ cum ar fi **memory leaks** sau chiar **crash-uri** ale aplicației,​ deoarece **destructorul** poate fi apelat de mai multe ori pe **aceeași resursă**.</​note>​ <note warning>​Comportamentul descris mai sus apare din cauza **problemei rombului**, care generează o **ambiguitate** ce conduce la **dublul apel** al constructorului și al destructorului clasei de bază **A**. Această situație poate deveni problematică în special în scenariile în care superclasa **A** gestionează resurse **alocate dinamic**. În astfel de cazuri, **ambiguitatea** poate duce la **comportament nedefinit**,​ cum ar fi **memory leaks** sau chiar **crash-uri** ale aplicației,​ deoarece **destructorul** poate fi apelat de mai multe ori pe **aceeași resursă**.</​note>​
  
-Rezolvarea acestei ​probleme este **derivarea virtuală** a claselor intermediare **B** și respectiv **C** după cum urmează.+Rezolvarea acestei ​situații de ambiguitate se face prin **derivarea virtuală** a claselor intermediare **B** și respectiv **C** după cum urmează ​în blocul de cod de mai jos.
  
 <code cpp> <code cpp>
Line 139: Line 139:
 public: public:
  
- A() +    ​A() 
-+    
- std::cout << "​Constructor A\n";​ +        std::cout << "​Constructor A\n";​ 
- }+    }
  
- ~A() +    ​~A() 
-+    
- std::cout << "​Destructor A\n";​ +        std::cout << "​Destructor A\n";​ 
- }+    }
 }; };
  
Line 154: Line 154:
 public: public:
  
- B() : A() +    ​B() : A() 
-+    
- std::cout << "​Constructor B\n";​ +        std::cout << "​Constructor B\n";​ 
- }+    }
  
- ~B() +    ​~B() 
-+    
- std::cout << "​Destructor B\n";​ +        std::cout << "​Destructor B\n";​ 
- }+    }
 }; };
  
Line 169: Line 169:
 public: public:
  
- C() : A() +    ​C() : A() 
-+    
- std::cout << "​Constructor C\n";​ +        std::cout << "​Constructor C\n";​ 
- }+    }
  
- ~C() +    ​~C() 
-+    
- std::cout << "​Destructor C\n";​ +        std::cout << "​Destructor C\n";​ 
- }+    }
 }; };
  
Line 184: Line 184:
 public: public:
  
- D() : A(), B(), C() +    ​D() : A(), B(), C() 
-+    
- std::cout << "​Constructor D\n";​ +        std::cout << "​Constructor D\n";​ 
- }+    }
  
- ~D() +    ​~D() 
-+    
- std::cout << "​Destructor D\n";​ +        std::cout << "​Destructor D\n";​ 
- }+    }
 }; };
 </​code>​ </​code>​
Line 205: Line 205:
 int main() int main()
 { {
- D obj;+    ​D obj;
  
- std::cout << '​\n';​+    ​std::cout << '​\n';​
  
- return 0;+    ​return 0;
 } }
 </​code>​ </​code>​
Line 236: Line 236:
 int main() int main()
 { {
- A* obj = new D();+    ​A* obj = new D();
  
- std::cout << '​\n';​ +    ​std::cout << '​\n';​ 
- delete obj;+    delete obj;
  
- return 0;+    ​return 0;
 } }
 </​code>​ </​code>​
Line 267: Line 267:
 public: public:
  
- A() +    ​A() 
-+    
- std::cout << "​Constructor A\n";​ +        std::cout << "​Constructor A\n";​ 
- }+    }
  
- virtual ~A() +    ​virtual ~A() 
-+    
- std::cout << "​Destructor A\n";​ +        std::cout << "​Destructor A\n";​ 
- }+    }
 }; };
 </​code>​ </​code>​
poo-is-ab/laboratoare/12.1736591072.txt.gz · Last modified: 2025/01/11 12:24 by razvan.cristea0106
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0