Template-Polymorphismus: Wenn Templates nicht gut funktionieren
In C bieten Templates einen leistungsstarken Mechanismus für die generische Programmierung. Es gibt jedoch Einschränkungen hinsichtlich ihres polymorphen Verhaltens. Dieser Artikel beantwortet eine Frage zum Fehlen von Vorlagenpolymorphismus in einem bestimmten Szenario.
Die Abfrage
Ein Benutzer stößt beim Aufruf eines Konstruktors auf den Fehler „Keine passende Funktion“. das einen Parameter vom Typ Container
Eintauchen in den Polymorphismus
Polymorphismus ermöglicht die Erstellung von Objekten verschiedener Klassen werden als Objekte einer gemeinsamen Basisklasse behandelt. Dieses Verhalten gilt jedoch nicht für Vorlagen in C. Obwohl Foo von Interface abgeleitet ist, erstellt es Container
Die Nicht-Kovarianz von Vorlagen
Der Schlüsselaspekt hier ist die fehlende Vorlagen-Kovarianz. In kovarianten Vorlagen wird ein abgeleiteter Typ automatisch als gültiges Argument für eine Vorlage betrachtet, die ihren Basistyp erwartet. In C sind Vorlagen jedoch nicht kovariant.
Konsequenzen der Kovarianz
Betrachten Sie das folgende Beispiel:
class Fruit {...}; class Apple : public Fruit {...}; class Orange : public Fruit {...}; std::vector<Apple>& apple_vec; // Vector of apples std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!
Wie aus der Erklärung hervorgeht , kann die kovariante Behandlung von Vorlagen dazu führen, dass Typen, die eigentlich inkompatibel sein sollten, als kompatibel behandelt werden, wodurch die Typsicherheit verletzt wird.
Alternative Lösungen
Da kovariante Vorlagen in nicht unterstützt werden C müssen alternative Lösungen eingesetzt werden. Statische Asserts oder begrenzte Platzhalter (verfügbar in Java) können verwendet werden, um die erforderlichen Typbeziehungen zu erzwingen. In dem in der Abfrage erwähnten spezifischen Szenario kann eine einfache statische Zusicherung überprüfen, ob der übergebene Containertyp tatsächlich ein Container
Das obige ist der detaillierte Inhalt vonWarum kann ich einen „Container' nicht an einen Konstruktor übergeben, der „Container' erwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!