virtuelle Basisklasse mit der VCL
-
Ich habe folgendes Konstruct
struct allgemeinForm { virtual void Schnittstelle() = 0; }; class MyForm : public TForm, virtual public allgemeinForm { ... };Dies führt zu einer Access Violation bei der Erzeugung des Objektes.
Wenn ich in der Ableitung "virtual" weglasse, dann geht es.Hat jemand damit Erfahrung?
Gibt es noch etwas zu beachten?
-
Hallo
ich kann mir nicht vorstellen das das überhaupt kompiliert, bei mir (BCB5) kommt gleich die Fehlermeldung VCL-Klassen dürfen nicht mehrere Basisklassen haben (bezogen auf MyForm)
bis bald
akari
-
Er kompiliert das unter der Bedingung, das allgemeinFrom nur!! abstrakte Funktionen enthält. Es also eine reine Schnittstelle ist.
-
und allgemeine Form darf keine VCL-Klasse sein bzw. davon abgeleitet sein. Sonst bindet man nämlich zweimal TObject ein und das geht in die Hose, da Pascal keine Mehrfachvererbung unterstützt (dafür gibt es interface).
Mir ist nur nicht klar warum du hier virtual erben willst.
-
Das Ganze ist natürlich nur die Halbe Wahrheit.
Ich möchte die Formulare über eine Schnittstelle ansprechen.
Und das soll so gehen.struct allgemeinForm { virtual void Schnittstelle() = 0; }; class MyVCLForm : public TForm, virtual public allgemeinForm { ... }; class MyForm : virtual public allgemeinForm { //Code zum Steuern der Form }; class FertigeForm : public MyVCLForm, public MyForm { };Der Sinn des Ganze besteht darin, das ich meine VCL Formulare dann leichter durch Intrawebformulare austauschen kann.
-
Warum erbt fertigeForm zweimal? Auf diese Weise erbst du doppelt von allgemeinForm (Diamond of Death). Sowas sollte man unbedingt vermeiden. Ich sehe hier auch keinen Sinn drin.
Hast du effective C++ von Meyers gelesen? Da gibt es ein schönes Kapitel darüber.