Basisklasse in Abgeleitete Klasse kopieren?



  • Hallo,
    irgendwie sitze ich gerade aufm Schlauch 😢 ich habe folgendes.

    #include <iostream>
    
    using namespace std;
    
    class base{
    public:
    	base(){
    		var1 = 1;
    	}
    protected:
    	int getVar1(){
    		return var1;
    	}
    private:
    	int var1;
    };
    
    class derived : public base{
    public :
    
    	derived(){
    		var1 = 3;
    	}
    
    };
    
    int main()
    {
    	derived d;
    	base b;
    	d = b;
    	cout << d.getVar1 << endl;
    
    	return 0;
    }
    

    Ich möchte praktisch eine Copy erstellen, die allerdings die privaten Daten mitkopiert, da ich diese privaten Daten für Funktionen in der Abgeleiteten Klasse benötige.
    Und um es noch weiter runter zu brechen. Ich möchte eine existierendes Objekt um Funktionen erweitern.

    Also ich will bei einem fahrendem Auto den Motor tunen 😉

    Gruß
    wdsl



  • Und deine Frage ist?



  • Wie man ein existierendes Objekt erweitern kann.



  • class base{
    public:
        base(int foo = 1) : var1(foo) {
        }
    protected:
        int getVar1(){
            return var1;
        }
    private:
        int var1;
    };
    
    class derived : public base{
    public :
    
        derived() : base(3) {
        }
    
    };
    

    Alternativ, var1 auch protected machen. Dafür sind die Schlüsselwörter da.



  • #include <iostream> 
    
    using namespace std; 
    
    class base
    { 
    public: 
    	base(const int& var): var(var){ } 
    	virtual ~base(){}
    
        virtual const int& getVar() const {return var;} 
    
    private: 
        int var; 
    }; 
    
    class derived : public base
    { 
    public : 
    	derived(const int& var): base(var){} 
    
    	const int& getVar() const {return base::getVar();}
    }; 
    
    int main() 
    { 
        derived d(3); 
    
    	cout << d.getVar() << endl; 
    
    	base b(1);
        d = b.getVar(); 
    
        cout << d.getVar() << endl; 
    
    	cin.get();
        return 0; 
    }
    

    Alternativ Operatorüberladung.



  • AnderesBeispiel schrieb:

    class base
    { 
    public: 
    	base(const int& var): var(var){ } 
    	virtual ~base(){}
    
        virtual const int& getVar() const {return var;} 
    
    private: 
        int var; 
    }; 
    
    class derived : public base
    { 
    public : 
    	derived(const int& var): base(var){} 
    
    	const int& getVar() const {return base::getVar();}
    };
    

    Zwei Dinge:

    • int würde ich als Kopie und nicht als Referenz auf const über- und zurückgeben. Referenzübergabe als Optimierung lohnt sich erst bei grösseren Objekten, bei kleinen ist sie sogar kontraproduktiv (weil Referenzen auch kopiert werden müssen und zusätzlich Dereferenzierungskosten anfallen).
    • Die Funktion getVar() muss weder virtuell sein noch in der abgeleiteten Klasse überschrieben werden, wenn ihr Verhalten für beide Klassen identisch ist.

    Meinst du mit Operatorüberladung die Stream-Operatoren?



  • AnderesBeispiel schrieb:

    #include <iostream> 
    
    using namespace std; 
    
    class base
    { 
    public: 
    	base(const int& var): var(var){ } 
    	virtual ~base(){}
    
        virtual const int& getVar() const {return var;} 
    
    private: 
        int var; 
    }; 
    
    class derived : public base
    { 
    public : 
    	derived(const int& var): base(var){} 
    
    	const int& getVar() const {return base::getVar();}
    }; 
    
    int main() 
    { 
        derived d(3); 
        
    	cout << d.getVar() << endl; 
    
    	base b(1);
        d = b.getVar(); 
    
        cout << d.getVar() << endl; 
    
    	cin.get();
        return 0; 
    }
    

    Alternativ Operatorüberladung.

    Was für ein mieser Code. Auf keinen Fall sowas nachprogrammieren!



  • wdsl schrieb:

    ...
    Wie man ein existierendes Objekt erweitern kann.

    Was meinst Du damit? Mir ist das Problem nicht klar. Was soll das überhaupt mit der Zuweisung von einem derived-Objekt zu einem base-Objekt?


Anmelden zum Antworten