Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Destruktor Wirtualny

Ostatnio zmodyfikowano 2021-09-06 09:26
Autor Wiadomość
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

C/C++
#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;
}

P-178919
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'.
P-178920
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
P-178921
DejaVu
» 2021-09-06 09:21:27
C/C++
#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()
{
   
//INFO: Typ wskaźnika został zamieniony na A
   
A * a = new B( 74, 38 ); //Tworzysz obiekt typu B i przypisujesz do wskaźnika, który jest typu bazowego A
   
delete a; //Zwalniasz obiekt o typie wskaźnika 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.
P-178922
krystian123456
Temat założony przez niniejszego użytkownika
» 2021-09-06 09:26:14
Dziękuje
P-178923
« 1 »
  Strona 1 z 1