Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Vererbung     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Monkey12345
Unregistrierter




Beitrag Monkey12345 Unregistrierter 14:27:12 20.06.2012   Titel:   Vererbung            Zitieren

Hallo!
Ich habe folgende Matrixklasse geschrieben:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:
C++:
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
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 17119
Beitrag C++ Forumbot Forumbot 14:35:10 20.06.2012   Titel:              Zitieren

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.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
knivil
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5865
Beitrag knivil Mitglied 15:28:30 20.06.2012   Titel:              Zitieren

Warum ueberhaupt ableiten. Einfach eine allgemeine Matrixmultiplikation implementieren und schauen ob die Dimensionen stimmen. Wenn nicht beispielsweise ein std::logic_error werfen.

_________________
If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6871
Beitrag cooky451 Mitglied 16:16:06 20.06.2012   Titel:   Re: Vererbung            Zitieren

Monkey12345 schrieb:

C++:
    virtual void init(); //komplette Matrix initialisieren
    virtual Matrix operator*(Matrix &M); //Matrix Matrix Multiplikation

Aua, aua, aua. Warum tust du mir das an? :(

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
Bashar
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17749
Beitrag Bashar Mitglied 16:30:54 20.06.2012   Titel:              Zitieren

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 sein

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

_________________
OSL♥
c++.de :: C++ (auch C++0x und C++11) ::  Vererbung   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.