Unklarheit mit Schluesselwoertern in C++
-
Hallo,
ich bin neulich ueber folgende Schluesselwoerter bzw Kombinationen gestossen und wuerde gerne wissen was sie bedeuten. Die Frage mag etwas dumm klingen, aber bisher hab ich diese Begriffe in C++ noch nie benutzt bzw so gesehen. Das ganze ist aus einem Project welches per MS ViStu 6.0 kompiliert wird, welches fuer mich ebenfalls etwas neu ist.1. das Schluesselwort "interface"
interface Something { CONST_VTBL struct SomethingVtbl __RPC_FAR *lpVtbl; };Was ist das? Was bewirkt das "interface"? (Der Rest ist wohl Win abhaengig und interessiert mom noch nicht, weshalb ich es unter C++ gepostet habe).
2. Vererbung mit "public virtual"
class Servant : public virtual ServantBase { // ...Warum "virtual" hier bei der Vererbung?
Ach ja und 3. einen "inline" declarierten Konstruktor der dann leer ist - macht das ueberhaupt Sinn? Wann sollte ich einen Konstruktor "inline" deklarieren? Wenn die Klasse "klein" ist? LOL
PS: freue mich auch ueber Links zu den direkten Definitionen. Danke.
-
zu 1): ein google nach "interface keyword c++" liefert dir schnell den Hinweis, dass es sich um c++ .NET handelt, also eine MSVC Eigenheit. das Schlüsselwort interface gibt es in Standard-C++ nicht.
zu 2): ein google nach "virtuelle Vererbung" hilft hier weiter, da gibts dann Informationen und Diskussionen wann, wie und warum man virtuerlle Vererbung einsetzt.
zu 3): inline ist ein Hinweis an den Compiler, dass er den Codse der Funktion direkt an die aufrufende Stelle schreiben könnte, statt wie üblich einen Sprung zur aufgerufenen Funktion einzufügen. Inlining ist gerade bei sehr kleinen Funktionen (z.B. deinem leeren Konstruktor) nützlich, wenn der Sprung zur Funktion mehr kosten würde als die direkte Ausführung des Codes. Allerdings ists dem Compiler vorbehalten, das inline zu beherzigen oder auch nicht. In den meisten Fällen ist ein explizites Angeben von inline ein Fall von "premature optimization" (google hilft auch hier weiter).
zweite Anlaufstelle für Punkt 2 und 3 ist auch wikipedia...
-
pumuckl schrieb:
zu 1): ein google nach "interface keyword c++" liefert dir schnell den Hinweis, dass es sich um c++ .NET handelt, also eine MSVC Eigenheit. das Schlüsselwort interface gibt es in Standard-C++ nicht.
Dem wiederspreche ich, aber nur aus einem Grund: MS ViStu 6.0
Dort war noch kein C++ .Net vorhanden. Ich gehe hier eher davon aus das entweder:
a) Das Projekt doch nicht für MSVC6 gedacht ist (und du tatsächlich mit C++.Net richtig liegst)
oder
b) interface eher zu COM oder so gehört (musste mich nur als Anwender von COM-Controls bisher damit auseinander setzen).cu André
-
asc schrieb:
b) interface eher zu COM oder so gehört (musste mich nur als Anwender von COM-Controls bisher damit auseinander setzen).
Irgendwo in den Tiefen der windows.h-Welt gibt es ein
#define interface struct
-
Das mit
interfacehat mich kürzlich auch gerade gewundert, auch weil es ebenfalls vom Syntaxhighlighting betroffen ist. Zudem ist es in MSVC++ auch möglich, beispielsweise Folgendes zu schreiben:class MyClass abstract { };Und
MyClassist damit abstrakt. Das Merkwürdige ist, dass selbst wenn man eine Klasse auf C++-Weise abstrakt macht (durch rein virtuelle Funktionen), man beim Darüberfahren mit dem Mauszeiger einclass MyClass abstractsieht.
-
Nexus schrieb:
Das mit
interfacehat mich kürzlich auch gerade gewundert, auch weil es ebenfalls vom Syntaxhighlighting betroffen istUnter MSVC2005/2008 ist das auch teilweise sinnvoll (wenn gleich es mir lieber wäre, wenn man die Einstellung in Abhängigkeit ob C++/CLI oder normales C++ bekommen würde). Aber unter MSVC6 kann ich mir dies nicht vorstellen (habe aber keins im Zugriff).
-
Danke fuer die Antworten, zu "interface" laesst sich echt einiges ergooglen, bin nun etwas mehr darueber informiert. Das mit der Virtuellen Vererbung faellt mir nun auch wieder ein, stimmt - da war mal was mit Diamantstrukturen in der Vererbung, auch dies laesst sich sehr gut nachlesen und einfachst nachbauen.
Nur, welchen Sinn es macht extra einen Konstruktor zu deklarieren damit man ihn inlinen kann bleibt mir raetselhaft. Mir ist die Funktionsweise von inline (im Ggs zur "virtuellen Vererbung", anscheinend) einigermassen gut bekannt, dass es eine empfehlung ist, aber den Compiler nicht zum inlinen zwingt, etc. Aber ich dachte, dass solcherlei Optimierungen doch eigentlich von Hause aus gemacht werden, GERADE wenn der Ctor leer steht. Irgendwie scheint mir das eher als aufblaehen des Codes. Oder gibt es irgendeinen rationalen Grund zum inlinen eines leeren Ctors?
-
Fabeltier schrieb:
Danke fuer die Antworten, zu "interface" laesst sich echt einiges ergooglen, bin nun etwas mehr darueber informiert. Das mit der Virtuellen Vererbung faellt mir nun auch wieder ein, stimmt - da war mal was mit Diamantstrukturen in der Vererbung, auch dies laesst sich sehr gut nachlesen und einfachst nachbauen.
interface beim VC++ ist das selbe wie struct.
Und abstract ist zB komplett unbedeutend:
#define abstractEs dient lediglich der besseren "lesbarkeit" - wobei das natuerlich streitpunkt ist.
Nur, welchen Sinn es macht extra einen Konstruktor zu deklarieren damit man ihn inlinen kann bleibt mir raetselhaft. Mir ist die Funktionsweise von inline (im Ggs zur "virtuellen Vererbung", anscheinend) einigermassen gut bekannt, dass es eine empfehlung ist, aber den Compiler nicht zum inlinen zwingt, etc. Aber ich dachte, dass solcherlei Optimierungen doch eigentlich von Hause aus gemacht werden, GERADE wenn der Ctor leer steht. Irgendwie scheint mir das eher als aufblaehen des Codes. Oder gibt es irgendeinen rationalen Grund zum inlinen eines leeren Ctors?
das macht garkeinen Sinn was du hier geschrieben hast.
kannst du versuchen das ganze nochmal neu formuliert zu posten?
denn inline und virtuelle vererbung haben rein garnichts miteinander zu tun und wie bereits gesagt interface ist das selbe wie struct, bringt also bei vererbung keinen vorteil.
-
@Fabeltier:
Einen leeren ctor schreibt man am besten garnicht - wozu auch? Damit man sinnlos ein paar Zeilen Code mehr hat, und sich jeder fragt was der leere ctor soll?Grund zum expliziten inlinen: einige Compiler können immer noch nicht inlinen wenn der Code nicht in der aktuellen Übersetzungseinheit sichtbar ist.
-
wenn du nen leeren CTor willst, aber auch einen mit Paramtern?
-
JustAnotherNoob schrieb:
wenn du nen leeren CTor willst, aber auch einen mit Paramtern?
Was sollte ein leerer CTor mit Parametern bringen...?
-
Shade Of Mine schrieb:
JustAnotherNoob schrieb:
wenn du nen leeren CTor willst, aber auch einen mit Paramtern?
Was sollte ein leerer CTor mit Parametern bringen...?
nen leeren standard-ctor und einen mit parametern meint er wohl.
-
ja ok, an den fall hatte ich jetzt nicht gedacht -- obwohl das eigentlich garnicht SO selten vorkommt.
-
Shade Of Mine schrieb:
Und abstract ist zB komplett unbedeutend:
#define abstractEs dient lediglich der besseren "lesbarkeit" - wobei das natuerlich streitpunkt ist.
Bei mir (MSVC++ 2008 Express) reicht
abstractimmerhin aus, um den Kompiliervorgang mit der folgenden Fehlermeldung abzubrechen:Eine Klasse, die als "abstract" deklariert wurde, kann nicht instanziiert werden.
Abgeleitete Klassen scheinen dagegen automatisch nicht mehr abstrakt zu sein. Fragwürdige Sache...
-
Nexus schrieb:
Fragwürdige Sache...
*Irgendwas von "Microsoft" und "immer ihr eigenes Süppchen kochen" in den Bart brummelt*
PS.: nein, bitte jetzt keinen Flamewars mit Anti-M$ Parolen und kontra-Anti-M$-Parolen anfangen

PPS.: nein ich hab keinen Bart. Der ist pur virtuell, quasi
abstract
-
pumuckl schrieb:
PPS.: nein ich hab keinen Bart. Der ist pur virtuell, quasi
abstract
Dann dürfte es dich gar nicht geben?

-
Nexus schrieb:
pumuckl schrieb:
PPS.: nein ich hab keinen Bart. Der ist pur virtuell, quasi
abstract
Dann dürfte es dich gar nicht geben?

Achwo. Bart ist eine Basisklasse für Vollbart, Ziegenbart usw.

*SCNR*