Vererbung
-
Hallo!
Ich habe folgende Matrixklasse geschrieben:class Matrix { protected: int m, n; //Dimensionen vector <double> entry; //Einträge der m x n Matrix public: int getM(){return m;}; int getN(){return n;}; virtual double getCoefficient(int i, int j){return entry[i*getM() + j];}; virtual void setCoefficient(int i, int j, double coeff){entry[i*getM() + j] = coeff;}; void print(){for(int i =0; i<m; i++){for(int j = 0; j<n; j++){cout<<"["<<i<<"]["<<j<<"]: "<<getCoefficient(i, j)<<" ";}cout<<endl;}cout<<endl;}; Matrix(int m, int n); //Konstruktor für Matrix m x n ohne Einträge Matrix(int m, int n, double init); //Konstruktor für m x n Matrix mit init intialisiert virtual void init(); //komplette Matrix initialisieren virtual Matrix operator*(Matrix &M); //Matrix Matrix Multiplikation };Von dieser Klasse habe ich jetzt die Klasse SquareMatrix abgeleitet:
class SquareMatrix : public Matrix //speichert quadratische Matrizen { public: SquareMatrix(int n, double init) : Matrix(n, n, init){}; //Konstruktor wird von Matrix übernommen };Was ich jetzt erreichen möchte, ist, Objekte vom Typ SquareMatrix mit dem * - Operator zu multiplizieren. Da der Rückgabetyp hier aber Matrix ist, funktioniert das bei mir nicht. Ich hab das jetzt vorerst so gelöst, dass ich die Klasse SquareMatrix um die Methode "SquareMatrix operator*(SquareMatrix &M);" erweitert habe, also den Rückgabetypen angepasst.
Das scheint mir aber keine besonders elegante Lösung zu sein, meine Frage daher:
gibt es eine Möglichkeit, die Methode in die abgeleitete Klasse zu übernehmen, sodass sie auch von den abgeleiteten Klassen ohne spezielle Anpassung verwendet werden können?Danke im Voraus
Lg Monkey12345
-
Dieser Thread wurde von Moderator/in Christoph aus dem Forum Mathematik und Physik in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Warum ueberhaupt ableiten. Einfach eine allgemeine Matrixmultiplikation implementieren und schauen ob die Dimensionen stimmen. Wenn nicht beispielsweise ein std::logic_error werfen.
-
Monkey12345 schrieb:
virtual void init(); //komplette Matrix initialisieren virtual Matrix operator*(Matrix &M); //Matrix Matrix MultiplikationAua, aua, aua. Warum tust du mir das an?

-
Monkey12345 schrieb:
Ich hab das jetzt vorerst so gelöst, dass ich die Klasse SquareMatrix um die Methode "SquareMatrix operator*(SquareMatrix &M);" erweitert habe, also den Rückgabetypen angepasst.
Das scheint mir aber keine besonders elegante Lösung zu seinDas ist überhaupt keine Lösung, weil du auch den Parametertyp anpassen müsstest. Ich mein, was willst du mit einer Methode, die SquareMatrix*Matrix berechnen kann, das Ergebnis ist ja idR nicht quadratisch. Du willst eigentlich eine SquareMatrix*SquareMatrix -> SquareMatrix, und das geht nicht (oder nicht so einfach...), weil Parametertypen in der Ableitung nicht eingeschränkt werden dürfen (Kontravarianz).
Mich erinnert das ein bisschen an die bekannte Diskussion, ob Kreis ein Subtyp von Ellipse ist. Siehe auch Liskov Substitution Principle.