ich krass bin zerreißt einige Beispiel-Code aus der Wikipedia Virtual function Seite aus:
#include <iostream>
#include <vector>
class Animal {
public:
virtual void eat() const {
std::cout << "I eat like a generic Animal." << std::endl;
}
virtual ~Animal() {
}
};
class Wolf : public Animal {
public:
void eat() const {
std::cout << "I eat like a wolf!" << std::endl;
}
};
class Fish : public Animal {
public:
void eat() const {
std::cout << "I eat like a fish!" << std::endl;
}
};
Wenn Sie eat()
innerhalb des Animal
Konstruktor aufrufen, nennen es die Animal
eat()
Funktion jedes Mal. Auch wenn Sie ein Objekt Wolf
oder Fish
erstellen, da der Animal
-Konstruktor abgeschlossen wird, bevor das Unterklassenobjekt initialisiert wird, sind die überschreibenden eat
-Funktionen noch nicht vorhanden.
Dies ist ein Nachteil, weil es Verwirrung zwischen dem was erwartet wird und was tatsächlich passiert, verursachen kann. Wenn ich eat
überschreibe und dann ein Objekt meiner Unterklasse erzeuge, erwarte ich, dass meine überschriebene Funktion auch von einer Animal
Referenz aufgerufen wird. Ich erwarte es, weil das passiert, wenn der Aufruf explizit durch Code außerhalb des Konstruktors erfolgt. Das Verhalten ist innerhalb des Konstruktors anders, was dazu führt, dass ich verwirrt den Kopf kratze.
Dies ist einer der Gründe, warum ich den Google C++ Style Guide nicht mag. Der Aufruf virtueller Methoden aus Konstruktoren und Destruktoren sollte per se als Faustregel vermieden werden - wo Vermeiden ist nur dann, wenn Sie einen guten Grund haben und es in einer Code-Überprüfung verteidigen können. Auf der anderen Seite ist die Empfehlung, eine zweistufige Initialisierung zu verwenden, (schlichtweg falsch), und viele andere Styleguides empfehlen gegen zwei Schritte Initialisierung ... –
Bedenke, dass Googles Styleguide trotz des Seitentitels für C++ ist . Sie verbieten Ausnahmen und geben eine Bastard-Sprache, in der viele C++ - Idiome entweder nicht verwendet werden können oder ihre Nützlichkeit beraubt sind. Dies ist der Grund, warum sie eine zweistufige Initialisierung und alle fehleranfälligen Kopfschmerzen erfordern; Es gibt keine Möglichkeit, Fehler von einem Konstruktor anzuzeigen. Wenn Sie keinen bestimmten Grund haben, dem Google-Stil zu folgen, ignorieren Sie ihn. –