Virtual DestructorsFrom RAD Studio red dtor |
Virtual DestructorsFrom RAD Studio red dtor |
Teraz wystarczy w pliku aplikacji w sekcji include włączyć plik #include suma.h. Nie będzie komunikatów błędu, tylko czy to nie jest to samo co z dołączeniem pliku suma.cpp?
polymorphism napisał(a):No właśnie nie, bo nie możesz podmienić klasie bazowej jej konstruktora/destruktora z poziomu klasy pochodnej - właśnie tu jest ta różnica między metodą a destruktorem. Dlatego, tak sądzę, pomimo tej umownej czystej wirtualności powinieneś zapewnić implementację takiemu destruktorowi (o ile chcesz tworzyć instancję tej klasy lub jej pochodnej).
#include <iostream>
using namespace std;
class B
{
public:
virtual ~B() = 0;
};
B::~B()
{
cout << "~B\n";
}
class C : public B
{
public:
~C()
{
cout << "~C\n";
}
};
int main()
{
// C c;
B * pb = new C;
delete pb;
}
// wynik
// ~C
// ~B
class TSuma
{
private:
int a;
public:
TSuma();
virtual ~TSuma(void);
virtual dodawanie(int,int);
virtual Free();
};
#include "suma.h"
TSuma::TSuma()
{
}
TSuma::~TSuma(void)
{
}
TSuma::Free()
{
if(this) delete this;
}
double TSuma::dodawanie(int a, int b)
{
return (a+b);
}
Nie rozumiem, rozważamy klasę bazową abstrakcyjną (ma =0 przy metodzie/destruktorze), więc nie można stworzyć jej obiektu wiec jak jej mogę coś podmienić ?
class B
{
public:
virtual ~B() = 0; //<-- taki typowy 'pure virtual'
};
Wydaje mi się że metoda/destruktor jest pure virtual gdy jest oznaczona/y =0, bez znaczenia czy ma ciało czy nie.
A gdyby zamiast wywoływać destruktor z poziomu aplikacji stworzyć w klasie funkcje, która sama wywoływałaby destruktor (...)
polymorphism napisał(a):Heh, chyba się nie zrozumieliśmy Chodziło mi o taką klasę:
- Kod: Zaznacz cały
class B
{
public:
virtual ~B() = 0; //<-- taki typowy 'pure virtual'
};
Na bazie takiej klasy nic nie stworzysz (w sensie instancji), zapewnienie dtor'a w klasie pochodnej nic nie da, w przeciwieństwie do metod, więc taka konstrukcja jest mało praktyczna.
class C : public B
{
public:
};
C::~C()
{
// na końcu
B::~B(); //<- tu jest problem, ~B() nie ma definicji
}
polymorphism napisał(a):I dlatego pisałem o umownej, czystej wirtualności destruktora.
polymorphism napisał(a):Nie da się zdefiniować metod czysto wirtualnych z ciałem (w każdym razie ja nic o tym nie wiem). Tylko o to mi chodziło.
class B
{
public:
virtual void f()=0;
};
void B::f()
{
cout << "void B::f() =0;\n";
}
class C : public B
{
public:
void f() { B::f(); }
};
int main()
{
B * pb = new C;
pb->f();
delete pb;
}
wynik:
void B::f() =0;
3) musi być dostarczona jego implementacja w pochodnych klasach
wynik:
void B::f() =0;
Edit: zagalopowałem się z tym dodawaniem destruktora ~C().
class TSuma
{
private:
int n;
public:
TSuma();
//virtual ~TSuma();
double virtual suma(int,int);
};
TSuma::TSuma()
{
}
double TSuma::suma(int a, int b)
{
return (a+b);
}
extern "C" __declspec(dllexport) TSuma* Test()
{
TSuma* aa = new TSuma;
return aa;
}
typedef TSuma* (*Test4)();
HINSTANCE sciezka;
sciezka = LoadLibrary("suma.dll");
if(sciezka == NULL)
{
ShowMessage("Brak biblioteki DLL");
return;
}
Test4 przyklad=(Test4)GetProcAddress(sciezka,"_Test");
if(!przyklad)
{
ShowMessage("Nie znaleziono funkcji");
return;
}
TSuma* aa=(przyklad)();
Label1->Caption=aa->suma(A,B);
delete aa;
aa = NULL;
FreeLibrary(sciezka);
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif
class DLLIMPORT TSuma
{
public:
TSuma();
virtual ~TSuma();
virtual double suma(int,int);
};
TSuma::TSuma()
{
}
TSuma::~TSuma()
{
}
double TSuma::suma(int a, int b)
{
return (a+b);
}
extern "C" __declspec(dllexport) TSuma* Test()
{
return new TSuma;
}
extern "C" __declspec(dllexport) void Delete(TSuma* del)
{
delete del;
}
typedef TSuma* (*Test)();
typedef void (*Delete)(TSuma* aa);
HINSTANCE sciezka;
sciezka = LoadLibrary("suma.dll");
if(sciezka == NULL)
{
ShowMessage("Brak biblioteki DLL");
return;
}
Test _Test =(Test)GetProcAddress(sciezka,"_Test");
Delete _Delete = (Delete)GetProcAddress(sciezka,"_Delete");
if(!_Delete)
{
ShowMessage("Nie znaleziono funkcji");
return;
}
Form1->StatusBar1->Panels->Items[0]->Text="Znaleziono funkcję";
TSuma* aa = (_Test)();
aa->suma(5,6);
_Delete(aa);
FreeLibrary(sciezka);
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 12 gości