Kiedy czytam Effective C++, mówi, nigdy nie redefiniuj funkcji nie-wirtualnej w C++.przedefiniować funkcję inną niż wirtualna w C++
Jednak po przetestowaniu tego kodu poniższy kod kompiluje się poprawnie. Więc o co chodzi? To błąd, czy tylko zła praktyka?
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;
}
Urocza odpowiedź! Krótko mówiąc, i pokazuje, jak emocjonalne jest programowanie. – DarenW
Nie zgadzam się, autor Scott Meyers wskazuje, że dziedziczenie publiczne ustanawia niezmienną specjalizację dla klasy b. Ponadto użycie klasy jest mylące, gdy zachowanie f() zależy od definicji wskaźnika, a nie od definicji obiektu. Przykład: B x; A * ptr = & x; ptr-> f() // wywołuje wersję f() klasy A, a nie wersję B klasy f(), która jest myląca. – TheChrisONeil