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; };
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;
Dieser Code führt zu folgendem Compilerfehler:
error C2259: 'IFunnyInterface' : cannot instantiate abstract class
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"); } };
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;
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!