Destruktor Wirtualny
Ostatnio zmodyfikowano 2021-09-06 09:26
krystian123456 Temat założony przez niniejszego użytkownika |
Destruktor Wirtualny » 2021-09-06 09:09:09 Co w takim programie zmnienia słowo virtual przy konstruktorze klasy bazowej? Ze słowem virtual i bez wyjście jest takie same : kos A kos B des B des A #include <iostream>
using namespace std;
class A { int a, b; protected: A( int z, int p ) : a( z ) , b( p ) { cout << "kos A" << endl; } virtual ~A() { cout << "des A" << endl; } };
class B : public A { int c, d; public: B( int z, int p ) : c( z ) , d( p ) , A( 2, 6 ) { cout << "kos B" << endl; } ~B() { cout << "des B" << endl; } };
int main() { B * b = new B( 74, 38 ); delete b; return 0; }
|
|
DejaVu |
» 2021-09-06 09:11:19 Jeżeli wyrzucisz słowo kluczowe virtual z destruktora ~A, to nie wywoła się destruktor potomny i na konsoli nie zobaczysz 'des B'. |
|
krystian123456 Temat założony przez niniejszego użytkownika |
» 2021-09-06 09:15:30 Właśnie chodzi o to że po wyrzuceniu słowa virtual z ~A() , słówko des A, nadal się pojawia w konsoli |
|
DejaVu |
» 2021-09-06 09:21:27 #include <iostream>
using namespace std;
class A { int a, b; protected: A( int z, int p ) : a( z ) , b( p ) { cout << "kos A" << endl; } public: virtual ~A() { cout << "des A" << endl; } };
class B : public A { int c, d; public: B( int z, int p ) : c( z ) , d( p ) , A( 2, 6 ) { cout << "kos B" << endl; } ~B() { cout << "des B" << endl; } };
int main() { A * a = new B( 74, 38 ); delete a; return 0; }
To jest poprawny przykład. Jeżeli destruktor w klasie bazowej nie jest wirtualny, to nie wywoła się destruktor w klasie potomnej, co prowadzi do wycieków pamięci. |
|
krystian123456 Temat założony przez niniejszego użytkownika |
» 2021-09-06 09:26:14 Dziękuje |
|
« 1 » |