[Subtyping] Grundregel gilt bei Signaturen nicht.
-
Ich wollte mit folgendem Code testen, ob eine Signatur einer Funktion, welche eine BaseClass als Parameter enthaelt aequivalent zu genau der selben Funktion ist, mit dem einzigen Unterschied, dass ich die BaseClass durch eine DerivedClass ersetzt habe.
#include <iostream> using namespace std; class A{}; class B : public A {}; class Foo { public: virtual void print(A& a) { cout << "Ich bin die Base-class version von print" << endl; } }; class Bar : public Foo { public: virtual void print(B& b) { cout << "Ich bin die Derived-class version von print" << endl; } }; void sample(Foo& f) { B b; f.print(b); } int main() { Bar b; sample(b); return 0; }
Aus dem Ergebnis
UniX:~/Desktop$ ./a.out Ich bin die Base-class version von print
folgere ich, dass die Signaturen _nicht_ aequivalent sind.
Falls das aber der Fall sein sollte, wuerde die Grundregel fuer Subtyping verletzt, naemlich, dass an jeder Stelle,
an der eine Referenz/Zeiger auf ein Object eines BaseClass Typen vorkommt auch eine Referenz/Zeiger auf ein Object eines DerivedClass Typen vorkommen kann.