2

Ich habe 3 Klassen A, B, und C:Eine abstrakte Klasse ohne abstrakte Methode

class A 
{ 
/// Some Code 
}; 

class B : public A 
{ 
/// Some Code 
}; 

class c : public B 
{ 
/// Some Code 
}; 

Ich mag Klassen A und B abstrakte Klassen machen, um zu verhindern, dass Fälle von ihnen zu schaffen, aber Keine dieser beiden Klassen hat eine abstrakte Methode. Gibt es eine Möglichkeit, eine Klasse abstrakt zu machen, auch wenn sie keine abstrakten Methoden hat?

+4

Erstellen Sie einen reinen virtuellen Destruktor. Oder erlauben Sie nur geschützte Konstruktoren. –

+0

Wahrscheinlichkeiten sind, dass Sie Klassenvererbung überhaupt nicht benötigen. Betrachten Sie stattdessen HAS-A-Beziehungen. –

Antwort

2

Quoten sind, wenn Sie die Klassen als Basisklassen verwenden, wie im Beispielcode gezeigt, sollten sie virtuelle Destruktoren haben. Und da ein Destruktor eine Methode ist, können Sie dies zu einem rein virtuellen ("abstrakten") Destruktor machen, um die Klasse selbst "abstrakt" zu machen.

Hinweis, dass eine Implementierung kann immer noch für eine rein virtuelle Methode zur Verfügung gestellt werden, so dass Sie den folgenden Code verwenden:

class A 
{ 
    public: 
    virtual ~A() = 0; 

/// Some Code 
}; 

class B : public A 
{ 
    public: 
    virtual ~B() = 0; 

/// Some Code 
}; 

class C : public B 
{ 
    public: 
    virtual ~C() = 0; 

/// Some Code 
}; 
A::~A() { } 
B::~B() { } 
C::~C() { } 

Weil Basisklassen Destruktoren aufgerufen immer, wenn ein Objekt zu zerstören, Sie müssen die Basisklassenimplementierung nicht explizit in den Destruktoren für abgeleitete Klassen aufrufen.

Dies sollte Ihnen den gewünschten Effekt geben. Allerdings habe ich derzeit Probleme, eine überzeugende Anwendung für dieses Design zu finden. Der ganze Zweck einer abstrakten Klasse in C++ besteht darin, eine Schnittstelle zu definieren, und Sie können keine Schnittstelle haben, wenn keine Methoden definiert sind, die diese Schnittstelle bilden. Entweder bin ich einfach nicht schlau genug, oder du solltest dein Design überdenken.

+0

Warum hast du Destructor von C als rein virtuell auch gemacht? –

+0

Es braucht nicht rein virtuell zu sein, wenn 'C' nicht abstrakt sein soll. Das war nicht klar aus deiner Frage, @roey. Und während "virtual" für einen Destruktor impliziert wird, wenn Sie von einer Basisklasse mit einem virtuellen Destruktor erben, möchte ich es aus Gründen der Übersichtlichkeit trotzdem hinzufügen. –

Verwandte Themen