2 fragen zu verbung



  • Hi,

    ich beschäftige mich grad mit vererbung und komme an 2 stellen nicht weiter.

    wenn ich in meiner 2. klasse den konstruktor der basisklasse aufrufen will geht das ja so:

    klasse2::klasse2(int wert):basisklasse(wert){}
    

    wenn ich aber den wert noch verändern will, wie geht das dann? habe folgendes probiert, was aber zum error "shadows a parameter" führt

    klasse2::klasse2(int wert){
    //rechne mit wert rum
       klasse2::basisklasse(wert);
    }
    

    wie kann ich einer print-methode aus der basisklasse beibringen parameter meiner unterklasse mit auszugeben? ich habe folgendes:

    class basisklasse{
    private:
       int wert;
    public:
       basisklasse(int wert){
       this->wert=wert;
       }
       void print(){
          cout << wert << endl;
       }
    };
    
    class klasse2{
    private:
       static string name;
    public:
       klasse2(int wert):basisklasse(wert){}
    };
       klasse2::name="NAME";
    
    //woanders dann parser:
       vector <basisklasse*> v;
    // fülle v mit klasse2-objekten, die von basisklasse abgeleitet sind
    
    int main (void){
       vector <basisklasse*> v;
       v=parser();
       for (size_t i = 0; i < v.size(); i++) {
          v[i]->print(); // möchte hier aber als ausgabe NAME+wert
       }
    }
    

    steh hier grad völlig auf dem schlauch, vielleicht hat ja einer von euch ne idee.

    grüße



  • kons schrieb:

    wenn ich aber den wert noch verändern will, wie geht das dann?

    So nicht, du kannst den Konstruktor der Basisklasse nicht verzögert aufrufen, da das Basisobjekt im Konstruktorrumpf bereits existieren muss. Warum kannst du dem Konstruktor nicht gleich den richtigen Wert übergeben?

    kons schrieb:

    wie kann ich einer print-methode aus der basisklasse beibringen parameter meiner unterklasse mit auszugeben?

    Befasse dich mal mit dem Konzept der virtuellen Funktionen und Laufzeitpolymorphie.



  • Zu 1. wie Nexus schon schrieb, verzögert geht nicht, aber du kannst eine eigene Funktion verwenden:

    klasse2::klasse2(int wert)
      : basisklasse(BerechneWert(wert))
    {}
    
    int klasse2::BerechneWert(int wert)
    {
       return 2*wert; // oder auch komplizierter -)
    }
    

    Zu 2.

    class basisklasse{
    
    virtual void print()
    {
      ...
    }
    
    };
    

    Und in jeder abgeleiteten Klasse dann überschrieben...



  • Th69 schrieb:

    Zu 1. wie Nexus schon schrieb, verzögert geht nicht, aber du kannst eine eigene Funktion verwenden:

    klasse2::klasse2(int wert)
      : basisklasse(BerechneWert(wert))
    {}
    
    int klasse2::BerechneWert(int wert)
    {
       return 2*wert; // oder auch komplizierter -)
    }
    

    Was aber heikel ist, wenn man auf Member zugreift, die noch nicht initialisiert sind. Von daher würde wenn schon eine statische oder globale Funktion zur Berechnung verwenden. Global im anonymen Namensraum ist wahrscheinlich nicht schlecht, denn im Header muss die Deklaration ja nicht unbedingt stehen.



  • Sorry, ja, hätte ich dazu schreiben sollen, daß es eine statische Funktion sein sollte (oder aber wie du schreibst, global im anonymen Namensraum).


Anmelden zum Antworten