12 Stimmen

Abstrakte Klasse ohne abstrakte Methoden

Ist es möglich, eine Klasse in C++ abstrakt zu machen, ohne abstrakte Methoden zu deklarieren? Derzeit habe ich eine Sprite-Klasse mit einer StaticSprite- und einer DynamicSprite-Unterklasse. Ich würde die Klasse Sprite gerne abstrakt machen.

Das Problem ist, dass es keine gemeinsamen Methoden gibt. Nun, StaticSprite und DynamicSprite könnten sich eine draw()-Methode teilen, aber die Parameter dieser Methode sind unterschiedlich, so dass dies keine Option ist.

Ich danke Ihnen!

EDIT: Hier ist der Code, um zu zeigen, was ich zu tun versuche:

Sprite:

class Sprite
{
    public:
        Sprite(HINSTANCE hAppInst, int imageID, int maskID);
        ~Sprite();

    protected:
        HINSTANCE hAppInst;
        HBITMAP hImage;
        HBITMAP hMask;
        BITMAP imageBM;
        BITMAP maskBM;
        HDC hSpriteDC;
};

Statik-Sprit:

class StaticSprite : public Sprite
{
    public:
        StaticSprite(HINSTANCE hAppInst, int imageID, int maskID);
        ~StaticSprite();

        void draw(Position* pos, HDC hBackbufferDC);
};

Dynamischer Spruch:

class DynamicSprite : public Sprite
{
    public:
        DynamicSprite(HINSTANCE hAppInst, int imageID, int maskID);
        ~DynamicSprite();

        void draw(HDC hBackbufferDC);
};

Wie Sie sehen, ist es nutzlos, ein Sprite-Objekt zu erstellen, also möchte ich diese Klasse abstrakt machen. Aber ich kann draw() nicht abstrakt machen, da es verschiedene Parameter verwendet.

2voto

Erik Punkte 85308

Der traditionelle Weg, dies zu tun, besteht darin, einen rein virtuellen Destruktor zu erstellen und diesen dann zu implementieren.

// .h
struct Foo {
  virtual ~Foo() = 0;
};

// .cpp
Foo::~Foo() {
}

2voto

Mark B Punkte 93261

Das Problem ist, dass es Methoden, die sie gemeinsam nutzen.

Und genau da liegt das Problem. Sie sollten hier keine Vererbung verwenden! Wenn Sie nicht beabsichtigen, eine Klasse durch eine andere zu ersetzen, sollten sie einfach nicht in einer Eltern-Kind-Beziehung stehen.

Je nach Bedarf sollten sie völlig unverbunden sein, Vorlagen verwenden oder sich zusammensetzen.

EDIT: Basierend auf dem Code-Beispiel, sind Sie erben, um wiederverwenden und ich würde vorschlagen, mit Komposition statt. Sprite könnte ein struct die beiden Eigentümern gehört DynamicSprite y StaticSprite . Sie können so viel/wenig Hilfslogik in Sprite nach Bedarf.

0voto

Martin Beckett Punkte 92477

Um eine rein abstrakte Klasse zu erstellen, die nicht instanziiert werden kann, ohne von ihr abzuleiten, müssen Sie mindestens eine abstrakte Methode definieren.

z. B.

 virtual void blah() const = 0;

Ansonsten können Sie jede beliebige Klasse als abstrakte Klasse verwenden

-1voto

J T Punkte 4686

Wenn Sie unbedingt Vererbung verwenden müssen, sollten Sie das Idiom der nicht-virtuellen Schnittstelle (NVI) verwenden (siehe http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.3 )

Im Wesentlichen definiert die Basisklasse einen überladenen, nicht-virtuellen Satz von Methoden, die geschützte rein virtuelle Funktionen der abgeleiteten Klassen aufrufen.

Was Sie definitiv nicht tun wollen, ist eine virtuelle Funktion zu überladen (was Sie anscheinend wirklich tun wollen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X