Compilerfehlermeldung fehlt



  • Hallo zusammen
    Ich habe ein Interface mit "pure virtual"-Methoden definiert und eine Klasse erbt davon. Eigentlich erwarte ich eine Fehlermeldung vom Compiler, wenn die erbende Klasse diese Methode nicht umsetzt. Aber leider stört sich der C++Builder 6 nicht daran und compiliert durch.
    Gibt es dazu eine Einstellung im Builder oder verstehe ich da nur was falsch?

    Achja, hier noch kurz ein Beispielcode:
    Interface

    class A
    {
    public:
       virtual void nextStep() = 0;
    };
    

    umsetzende Klasse

    class B : public TForm, A
    {
    };
    

    Natürlich haben die Klassen die "ifndef, define endif"-Struktur und B hat auch die notwendigen Methoden von TForm.

    Mit dem Interface will ich erzwingen, dass alle erbenden Klassen diese Methode bereitstellen, aber, wie gesagt, meldet sich der Compiler nicht. Momentan würde ich es erst zur Laufzeit feststellen.
    Und wenn ich das Erben so umsetze:

    class B : public TForm, virtual A
    

    Erscheint eine Laufzeitfehlermeldung gleich nach Start, die aber keinen direkten Hinweis auf den Fehler gibt.

    Bitte gebt mir Tipps, woran das bei mir scheitert.



  • Hallo,

    Hast du versuch mal eine Instanz deiner Klasse B zu erstellen?
    Das erben von abstrakten Klassen ohne Redefinition der pure virtuellen Funktionen ist ja nicht verboten, nur das instanziieren.
    Du solltest einen Zugriffsspezifizierer (public oder private vor deiner zweiten Klasse angeben.
    [edit]
    Du solltest dir das mit der Mehrfachvererbung lieber nochmal überlegen. Das kann im Zusammenhang mit VCL-Klassen leicht schief gehen. Solange nur eine VCL-Klasse im Spiel ist mag das evtl. noch gehen.
    [edit]



  • Hallo Braunstein
    Da es sich bei der Klasse um ein Formular handelt, welches der Builder zu Programmstart erstellt, laufe ich leider direkt in einen Laufzeitfehler. Ansich würde es mir ja reichen, dass es eine Fehlermeldung gibt, wenn ich eine Instanz erstellen will. Diese Meldung entsteht auch, wenn ich "von Hand" ein solches Objekt erstelle.
    Nun hätte ich aber gerne auch eine Meldung, wenn der Builder mir ein solches Objekt erstellt, damit eine solche Methode nicht vergessen wird.

    Die Mehrfachvererbung habe ich mir schon genau überlegt. Ansich erbt die Klasse ja nur von TForm. Bei der anderen Klasse handelt es sich um ein reines Interface, welches Methoden vorschreibt. Daher sollte das kein Problem sein. Nur leider fehlt mir die Rückmeldung des Compilers, falls etwas fehlt.

    Gibt es denn noch speziellere Probleme, wenn VCL-Komponenten von weiteren Klassen erben (besonders im Bezug auf Interfaces)? Oder muss man die Interfaceumsetzung anders realisieren (ich möchte Interfaces so nutzen, wie sie auch in Java definiert sind)?



  • Hallo,

    Da VCL-Klassen alle zur Laufzeit erstellt werden, hast du keine Chance so etwas zur Compilezeit festzustellen. Ich weiß jetzt zu wenig über deine Klassen, um hier konkrete Vorschläge zu machen. Wenn die Möglichkeit besteht, solltest du halt auf die Mehrfachvererbung hier verzichten, und lieber mit Layering arbeiten.
    Eine Möglichkiet wäre evtl. noch, wenn du B nicht direkt von A erben lässt, sondern eine weitere Klasse dazwischen schaltest, die von A erbt und die abstrakte Methode definieren muß. Dann könntest du ja irgendwo im Quelltext von dieser Klasse ein Dummy-Objekt (am besten nur im Debugmodus) erstellen um einen Compilerfehler zu provozieren.
    Bezüglich Mehrfachvererbung bei dewr VCL besteht das Hauptproblem darin, dass alle VCL-Klassen von TObject erben und du somit TObject mehrfach in die Vererbungslinie bekommst. Da VCL-Klassen Pascal sind und Pascal weder Mehrfachvererbung (bis auf Interface) noch virtuelle Vererbung kennt, bekommst du hier ein Problem. Das spielt bei dir ja noch keine Rolle.
    [edit]
    Hier gibt es ein paar Threads zum Thema
    http://groups.google.de/group/borland.public.cppbuilder.vcl.components.writing
    [edit]



  • Vielen Dank für deine Antwort. Meine VCL-Komponenten erben nur von reinen Interfaces, welche unabhängig von der VCL sind. Daher sollte dort kein Problem auftreten.
    Deine Erklärung für die Laufzeitfehler ist auch sehr gut. Dadurch habe ich verstanden, warum der Compiler sich nicht meldet.
    Vielen Dank


Anmelden zum Antworten