2014-08-28 11 views
5

Ich möchte eine virtuelle Funktion eines QWidget überschreiben, ohne es zu unterklassifizieren. Es ist in Java möglich. Ich fand diesen Link:Qt/C++ Override-Funktion ohne Unterklasse

overriding methods without subclassing in Java

Nicht sicher, ob es eine Möglichkeit in C++ zu. Irgendwelche Ideen?

+1

Ich glaube nicht, dass das möglich ist. Aber wenn es das letzte Ziel ist, die neue Unterklasse im Design-Modus von Qt Creator zu verwenden, dann ist das durchaus möglich. – Ali

+0

Warum willst du keine Unterklasse? –

+0

Grundsätzlich, weil ich wie 10 verschiedene Klassen und seine einzige Funktion von jeder Klasse, die ich neu implementieren müsste. also würde ich etwas zeit sparen. Aber wie Ali sagte, denke ich auch nicht, dass es möglich ist. – Cocomico

Antwort

11

Sie können nicht ohne Vererbung überschreiben. Der Code im verknüpften Beispiel enthält eine Unterklasse. Vielleicht liegt die Verwirrung an der Tatsache, dass das Schlüsselwort extends nicht verwendet wird. Es erstellt eine anonyme Unterklasse von XStream und überschreibt seine Methode. Solche Klassen existieren auch in C++ und ähnlicher Code ist möglich. Die Namenskonvention ist ein bisschen anders. Klassen, die keinen Namen haben, aber eine benannte Instanz haben, heißen unbenannt. Hier ist meine Umschrift des Codes zu zeigen, wie das Beispiel mit unbenannte Klasse in C++ erfolgen:

class SomeClass { 
public: 
    void myMethod() { 
     class: public XStream { 
     protected: 
      MapperWrapper wrapMapper(const MapperWrapper& next) override { 
       return MapperWrapper(next); // the example is cut off here, persumably it's creating another nested anonymous class, but i'll keep this simple 
      } 
     } xstream; 
    } 
}; 

Sie können die XStream mit QWidget und wrapMapper mit einem seiner virtuellen Klassen ersetzen, wenn Sie es außer Kraft setzen möchten in diesen Weg.

Anonyme Klassen werden oft für Rückrufe in Java verwendet. Aber in C++ haben wir Funktionszeiger und in letzter Zeit Lambdas, weshalb die Verwendung unbenannter Klassen in C++ - Code im Vergleich zu Java sehr viel seltener ist. Bevor C++ 11 unbenannte Klassen als Template-Parameter nicht erlaubt waren, waren sie auch für einen Callback-Funktor eine schlechte Wahl.

in C++, eine Anonym Klasse (oder Struktur) würde eine sein, die entweder keine benannte Instanz hat. Es könnte ein Mitglied einer anderen, äußeren Klasse sein und die Mitglieder der anonymen Klasse würden in den Namensraum der Elternklasse gebracht werden. Außer, anonyme Klassen sind vom Standard nicht erlaubt. Wie kann es dann eine Definition für so etwas geben? Nun, anonyme Gewerkschaften sind erlaubt und anonyme Klassen sind analog zu ihnen. Anonyme Strukturen sind jedoch nach C11-Standard zulässig.

7

Ihr Java-Beispiel ist eine Unterklasse - es ist nur eine anonyme Unterklasse. Das Schlüsselwort @Override ist einfach eine Diagnosehilfe: Es gibt einen Fehler aus, wenn die Methode eine Oberklasse nicht überschreibt. Das Entfernen von @Override hat keine Auswirkung auf den generierten Code. C++ 11 hat es auch - siehe this link.

In C++ wie in Java können Sie eine virtuelle Funktion nicht überschreiben, ohne eine Unterklasse zu deklarieren. Wenn Sie Qt effektiv nutzen wollen, müssen Sie sich daran gewöhnen!

Verwandte Themen