Jak należy utworzyć destruktor wirtualny w interfejsie? Z tego co się dowiedziałem, destruktor nie może być czysto wirtualny, więc musi mieć definicje. W takim razie, gdzie umieścić definicje destruktora interfejsu? Mam do tego celu stworzyć osobny plik .cpp, w którym znajdzie się jedynie definicja tego destruktora?
Tutaj znajduje się artykuł, który jest odpowiedzą na twoje pytanie: http://www.programmerinterview.com/index.php/c-cplusplus/virtual-destructors/
Musisz zapewnić "standardową implementacje"
struct IMashable{
virtual ~IMashable() = 0;
};
IMashable::~IMashable(){}
Tak, ale gdzie ma się znaleźć ta definicja. W tym samym pliku(.h), co deklaracja interfejsu?
Zrob w pliku *.h
, przeciez to tylko puste klamry.
Czyli jednak coś takiego w pliku .h jest poprawne?
class IClass{
public:
virtual ~IClass(){};
};
Skoro i tak i tak muszę zdefiniować destruktor, to w takim razie jest w ogóle sens robienia destruktora czysto wirtualnego?
Po metodzie średnik nie jest potrzebny.
randomx napisał(a):
Skoro i tak i tak muszę zdefiniować destruktor, to w takim razie jest w ogóle sens robienia destruktora czysto wirtualnego?
Ma to sens kiedy chcesz zdefiniować klasę abstrakcyjną ale jakimś cudem każda z metod tej klasy ma swoją implementację. Wtedy chronisz się przed jawnym utworzeniem obiektu tej klasy.
struct A
{
virtual ~A() = 0;
};
A::~A() = default;
struct B : public A
{
~B() = default;
};
int main()
{
//A a; error: cannot declare variable ‘a’ to be of abstract type ‘A’
B b;
return 0;
}
Warto dodać, że podobnie możesz przygotować implementację dla każdej z metod czysto wirtualnych. Po co robić coś takiego? Ano np. po to żeby przygotować domyślną implementację jakiejś metody pozostawiając nadal tę metodę czysto wirtualną.
struct A
{
virtual void foo() = 0;
virtual ~A() = 0;
};
void A::foo() { std::cout << "A::foo()" << std::endl; }
A::~A() = default;
struct B : public A
{
virtual void foo() override { return A::foo(); }
~B() = default;
};
int main()
{
//A a; error: cannot declare variable ‘a’ to be of abstract type ‘A’
B b;
b.foo();
return 0;
}
Okey, dzięki. Już chyba wszystko jasne.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.