Destruktor wirtualny w interfejsie

0

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?

0

Tutaj znajduje się artykuł, który jest odpowiedzą na twoje pytanie: http://www.programmerinterview.com/index.php/c-cplusplus/virtual-destructors/

0

Musisz zapewnić "standardową implementacje"

struct IMashable{
   virtual ~IMashable() = 0;
};

IMashable::~IMashable(){}
0

Tak, ale gdzie ma się znaleźć ta definicja. W tym samym pliku(.h), co deklaracja interfejsu?

0

Zrob w pliku *.h, przeciez to tylko puste klamry.

0

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?

0

Po metodzie średnik nie jest potrzebny.

3
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;
}
0

Okey, dzięki. Już chyba wszystko jasne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1