Heim > Backend-Entwicklung > C++ > Können Sie einen Vektor abstrakter Klassen in C erstellen?

Können Sie einen Vektor abstrakter Klassen in C erstellen?

Mary-Kate Olsen
Freigeben: 2024-12-02 07:41:14
Original
423 Leute haben es durchsucht

Can You Create a Vector of Abstract Classes in C  ?

Vektor abstrakter Klassen in C: Ein Primer

In C bieten abstrakte Klassen eine Möglichkeit, Schnittstellen ohne Implementierung zu definieren und abgeleitete Klassen zu ermöglichen bestimmte Verhaltensweisen zu erben und umzusetzen. Anders als in C#, wo Schnittstellen direkt instanziiert werden können, ist dies bei abstrakten Klassen in C jedoch nicht möglich.

Das Problem

Betrachten Sie das folgende C-Beispiel:

class IFunnyInterface
{
public:
    virtual void IamFunny() = 0;
};
Nach dem Login kopieren

Diese abstrakte Klasse stellt eine Schnittstelle mit einer einzigen Methode dar, IamFunny. Nehmen wir nun an, wir möchten einen Vektor von Objekten erstellen, die diese Schnittstelle implementieren, wie zum Beispiel:

std::vector<IFunnyInterface> funnyItems;
Nach dem Login kopieren

Dieser Code führt zu folgendem Compilerfehler:

error C2259: 'IFunnyInterface' : cannot instantiate abstract class
Nach dem Login kopieren

Dieser Fehler tritt auf, weil C keine Instanziierung abstrakter Klassen zulässt.

Eine Problemumgehung

Einer Die Problemumgehung besteht darin, die abstrakte Klasse durch eine konkrete Klasse zu ersetzen, die eine Ausnahme auslöst, wenn versucht wird, eine nicht implementierte Methode aufzurufen:

class IFunnyInterface
{
public:
    virtual void IamFunny()
    {
        throw new std::exception("not implemented");
    }
};
Nach dem Login kopieren

Diese Problemumgehung ermöglicht zwar die Vektorinstanziierung, führt jedoch zu einer potenziellen Gefahr: Code, der dies versucht Wenn Sie auf die Methoden eines IFunnyInterface-Objekts zugreifen, müssen Sie die Ausnahme behandeln.

Eine Alternative Lösung

Eine elegantere Lösung ist die Verwendung eines Vektors von Zeigern auf abstrakte Klassen:

std::vector<IFunnyInterface*> ifVec;
Nach dem Login kopieren

Dieser Ansatz ermöglicht polymorphes Verhalten und vermeidet das Objekt-Slicing-Problem, das bei auftreten kann direkte Wertspeicherung.

Wenn Sie die Einschränkungen der Instanziierung abstrakter Klassen in C verstehen, können Sie geeignete Problemumgehungen anwenden oder Alternativen verwenden, um die gewünschte Funktionalität zu erreichen Ihr Code.

Das obige ist der detaillierte Inhalt vonKönnen Sie einen Vektor abstrakter Klassen in C erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage