Stellen Sie sich die folgenden Klassen:Wird eine Methode virtuell aufgerufen, auch wenn keine Unterklasse sie überschreibt?
class A {
public:
virtual void print() { printf("A\n"); }
};
class B : public A {
public:
virtual void print() override { printf("B\n"); }
};
class C : public B {
// no override of print
};
Und jetzt, wenn Sie eine Instanz von B erstellen und drucken nennen:
B * b = new B;
b->print();
Wird diese Methode praktisch genannt werden? Mit anderen Worten, wird die genaue Methode, die aufgerufen werden soll, zur Kompilierungszeit oder zur Laufzeit bestimmt?
Theoretisch kann es zur Kompilierzeit bestimmt werden, weil wir wissen, dass keine der Unterklassen von B diese Methode außer Kraft setzt, also unabhängig davon, was ich dem Zeiger auf B zuteile, wird es immer B::print()
aufrufen.
Weiß der Compiler es auch und rette mich vor unnötigem Overhead des virtuellen Anrufs?
Welcher ist der "Compiler"? –
Wahrscheinlich implementierungsspezifisch - einige, aber nicht alle Compiler würden die von Ihnen vorgeschlagene Optimierung durchführen. –
Höchstwahrscheinlich wird es optimiert, wenn es zusätzlich markiert ist (http://en.cppreference.com/w/cpp/language/final), aber ich kann das nicht mit Sicherheit sagen, da ich es nicht weiß viel über den Mut der Compiler. – vsoftco