inline und virtual
-
Kurze Frage: Laut Standard ist es doch nicht verwerflich eine virtuelle Funktion gleichzeitig auch noch mit inline zu kennzeichnen? Ich Frage nur, weil ich einige Leute kenne die das behaupten. Tatsache ist, dass es mit jedem Compiler, mit dem ich es ausprobiert habe, funktioniert hat.
-
Ich nehme an in diesem Fall ignoriert der Compiler
einfach das inline (welches ja sowieso nur eine Empfehlung ist).
Den woher soll der Compiler wissen welche Funktion er einsetzten
soll wenn das erst zur Laufzeit feststeht.
-
Was ist, wenn es sich um Methoden einer Template-Klasse handelt? Wenn ich diese nicht als inline markiere bekomm ich z.B. eine Compilerwarnung weil ich sie bekanntlich nicht per export definieren kann.
-
anti-schnitzl schrieb:
Was ist, wenn es sich um Methoden einer Template-Klasse handelt? Wenn ich diese nicht als inline markiere bekomm ich z.B. eine Compilerwarnung weil ich sie bekanntlich nicht per export definieren kann.
Was genau meinst du? Du kannst auch Templates als nicht-inline implementieren (die ODR ist für Templates nur so semi gültig).
-
Inline und virtual vertragen sich wunderbar, und das inline wird auch nicht ignoriert - der Compiler kann immer noch an einigen Stellen den Aufruf inline expandieren.
-
hustbaer schrieb:
Inline und virtual vertragen sich wunderbar, und das inline wird auch nicht ignoriert - der Compiler kann immer noch an einigen Stellen den Aufruf inline expandieren.
Nämlich genau dort, wo er den dynamischen Typ des Objekts, auf dem die Methode aufgerufen wird, kennt. Also z.B. immer dann, wenn der Aufruf über ein Objekt (und nicht über eine Referenz/Pointer) erfolgt oder explizit qualifiziert ist.
Beim Aufruf über eine Referenz/Pointer müsste der Compiler hingegen eine Hierarchie-Analyse durchführen, was einige moderne Compiler durchaus tun.
-
.filmor schrieb:
anti-schnitzl schrieb:
Was ist, wenn es sich um Methoden einer Template-Klasse handelt? Wenn ich diese nicht als inline markiere bekomm ich z.B. eine Compilerwarnung weil ich sie bekanntlich nicht per export definieren kann.
Was genau meinst du? Du kannst auch Templates als nicht-inline implementieren (die ODR ist für Templates nur so semi gültig).
Die ODR (one definition rule) ist für Templates nicht semi gültig, im Gegenteil, sie legt gerade fest, dass solche einmal pro ÜE definiert werden dürfen.