[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.


Anmelden zum Antworten