Um diese Frage vollständig zu beantworten, muss man verstehen, dass die Eigenschaft virtual
unabhängig auf die Funktion selbst und auf die Aufrufe dieser Funktion angewendet wird. Es gibt virtuelle und nicht-virtuelle Funktionen. Zu diesen Funktionen gibt es virtuelle und nicht virtuelle Aufrufe.
Das gleiche gilt für die Eigenschaft, inline
zu sein. Es gibt Inline- und Nicht-Inline-Funktionen. Und es gibt inline und nicht inline Anrufe zu diesen Funktionen.
Diese Eigenschaften - virtual
und inline
- wenn sie auf die Funktion selbst angewendet werden, stehen sie nicht in Konflikt. Sie haben einfach keinen Grund und keine Chance zu Konflikten. Das einzige, was der Spezifizierer inline
für die Funktion selbst ändert, ist, dass er die Eine-Definition-Regel für diese Funktion modifiziert: Die Funktion kann in mehreren Übersetzungseinheiten definiert werden (und muss in jeder Übersetzungseinheit definiert werden, in der sie verwendet wird). Die einzige Änderung virtual
ist, dass die Klasse, die diese Funktion enthält, polymorph wird. Es hat keinen wirklichen Einfluss auf die Funktion selbst.
Also, es ist absolut kein Problem, eine Funktion virtual
und inline
zur gleichen Zeit zu deklarieren. Es gibt keine Grundlage für den Konflikt. Es ist absolut legal in C++ Sprache.
struct S {
virtual void foo();
};
inline void S::foo() // virtual inline function - OK, whatever
{
}
jedoch, wenn die Menschen diese Frage stellen, sind sie in der Regel in den Eigenschaften der Funktion nicht interessiert selbst, sondern in den Eigenschaften der an die Funktion Anrufe.
Das bestimmende Merkmal eines virtuellen Call ist, dass es während der Laufzeit aufgelöst wird, was bedeutet, dass es in der Regel unmöglich ist, echte virtuelle Anrufe Inline:
S *s = new SomeType;
s->foo(); // virtual call, in general case cannot be inlined
Wenn jedoch ein Anruf von selbst nicht virtuell (auch wenn es in eine virtuelle Funktion geht), ist inlining kein Problem:
S *s = new SomeType;
s->S::foo(); // non-virtual call to a virtual function, can easily be inlined
natürlich in einigen Fällen eine optimierende Compiler möglicherweise in der Lage das Ziel eines virtuellen Call bei der Kompilierung, um herauszufinden, und inline sogar einen solchen virtuellen Anruf. In einigen Fällen ist es einfach:
S ss;
ss.foo(); // formally a virtual call, but in practice it can easily be inlined
In einigen Fällen ist es komplizierter, aber immer noch machbar ist:
S *s = new S;
s->foo(); // virtual call, but a clever compiler might be able
// to figure out that it can be inlined
ich eine wirkliche Frage hier nicht ... –
hallo, was tun Sie bedeuten? Ich habe das Problem nicht klar angesprochen? Das tut mir leid. – skydoor
Inline-Funktionen sind niemals notwendig, daher wird es schwierig sein, Ihnen eine notwendige Inline-Funktion zu zeigen. – zneak