Wenn ich Effektives C++ lesen, heißt es, nie eine nicht-virtuelle Funktion in C++ neu definieren.eine nicht virtuelle Funktion in C++ neu definieren
Allerdings, wenn ich es getestet habe, kompiliert der folgende Code richtig. Also, was ist der Punkt? Es ist ein Fehler oder nur eine schlechte Übung?
class A {
public:
void f() { cout<<"a.f()"<<endl;};
};
class B: public A {
public:
void f() { cout<<"b.f()"<<endl;};
};
int main(){
B *b = new B();
b->f();
return 0;
}
Schöne Antwort! Kurz, auf den Punkt, und zeigt, wie emotionale Programmierung ist. – DarenW
Ich stimme nicht zu, der Autor Scott Meyers weist darauf hin, dass öffentliche Vererbung eine Invariante über Spezialisierung für Klasse b etabliert. Außerdem ist die Klassenverwendung verwirrend, wenn das Verhalten von f() von der Zeigerdefinition und nicht von der Objektdefinition abhängt. Beispiel: B x; A * ptr = & x; ptr-> f() // ruft die Klasse-A-Version von f() und nicht die Klasse-B-Version von f() auf und das ist verwirrend. – TheChrisONeil