arg - virtuelle funktionen



  • moin

    ich hab ein problem mit virtuellen funktionen, ich raffs nämlich garnet :o
    kann mir da jemand vielleicht ein wneig helfen, da mein script dafür
    ziemlich unbrauchbar ist :|

    #include <iostream.h>
    
    class zahl
    {
    	private:
    		int a;
    		int b;
    	public:
    		zahl::funktion();
    		virtual void ausgabe();
    };
    
    class ya:public zahl
    {
    	public:
    		void ausgabe();
    };
    
    void ausgabe()
    {
    	cout<<"Ausgabe durch virtuelle Funktion"<<endl;
    }
    
    zahl::funktion()
    {
    	cout<<"Berechnung des maximums der Zahlen a und b."<<endl;
    	cout<<"Bitte geben Sie den Wert fuer a ein: "<<endl;
    	cin>>a;
    	cout<<"Bitte geben Sie den Wert fuer b ein: "<<endl;
    	cin>>b;
    	if (a>b)
    		{
    			cout<<"Maximum ist :"<<a<<endl;
    		}
    	else if (a<b)
    		{
    			cout<<"Maximum ist :"<<b<<endl;
    		}
    	else {cout<<"OMG"<<endl;}
    }
    
    void main()
    {
    	ya eins;
    	eins.funktion();
    	eins.ausgabe();
    }
    

    :der quelltext is wahrscheinlich unbrauchabr weil ich schon viel zumprobiert habe:
    mfg rum



  • ya::ausgabe hast du nicht definiert, dafür eine freie Funktion ausgabe.

    Außerdem sollte irgendwo ein Zeiger oder eine Referenz auftauchen, sonst tut virtual nichts.



  • Hallo

    void zahl::ausgabe()
    {
      }
    ...
    void ya::ausgabe()
    {
      }
    ...
    

    bis bald
    akari



  • void ya:ausgabe()
    {
        cout<<"Ausgabe ya"<<endl;
    }
    void zahl:ausgabe()
    {
        cout<<"Ausgabe basis"<<endl;
    }
    

    mfg
    // zu spät verdammt 🙂



  • #include <iostream>
    using namespace std;
    
    class zahl
    {
        private:
            int a;
            int b;
        public:
            void funktion();
            virtual void ausgabe() = 0;
    };
    
    class ya : public zahl
    {
        public:
            virtual void ausgabe();
    };
    
    void ya::ausgabe()
    {
        cout<<"Ausgabe durch virtuelle Funktion"<<endl;
    }
    
    void zahl::funktion()
    {
        cout<<"Berechnung des maximums der Zahlen a und b."<<endl;
        cout<<"Bitte geben Sie den Wert fuer a ein: "<<endl;
        cin>>a;
        cout<<"Bitte geben Sie den Wert fuer b ein: "<<endl;
        cin>>b;
        if (a>b)
            {
                cout<<"Maximum ist :"<<a<<endl;
            }
        else if (a<b)
            {
                cout<<"Maximum ist :"<<b<<endl;
            }
        else {cout<<"OMG"<<endl;}
    }
    
    int main (void)
    {
        ya eins;
        eins.funktion();
        eins.ausgabe();
    }
    

    1. int main (void) und nicht void main (void)
    2. include<iostream>
    using namespace std;
    3. Am besten noch einen Konstruktor schreiben
    4. virtual am besten auch bei der abgeleiteten Klasse hinschreiben, dann ist es übersichtlicher
    5. Wenn man bei der Basisklasse die virtuelle Funktion nich definiert = 0 dahinter schreiben (verhindert Instanziierung)
    6. void funktion(); und nicht funktion() in C++ gibt es kein implizites zurückgeben von int (außerdem wird ja kein auch nichts zurückgegeben)

    Mfg

    Felix



  • huhu

    ok also ich nach langem wühlen doch ein beispiel gefunden welches
    mir die sache relativ übersichtlich erklärt
    das mit dem zeiger scheint unabdinglich zu sein^^
    hier der code falls jemand intresse hat was ich gefunden habe^^

    #include <iostream>
    using namespace std;
    
    class basis
    {
    	public:
    		virtual void ausgabe()					//definition der virtuellen funktion in der basisklasse
    		{
    			cout<<"basis ausgabe"<<endl;
    		}
    };
    
    class abgeleitet:public basis
    {
    	public:
    		virtual void ausgabe()					//definition der virtuellen funktion in der abgeleiteten klasse
    		{
    			cout<<"abgeleitet ausgabe"<<endl;	//rückgabewert und formalparameterliste sind gleich mit
    		}										//gleichnamiger funktion der basisklasse
    };
    
    void main()										//eigentliche main
    {
    	cout<<"Virtuelle Funktion 'ausgabe' der basisklasse 'basis'."<<endl;
    	cout<<"Virtuelle Funktion 'ausgabe' der abgeleiteten klasse 'abgeleitet'."<<endl;
    	cout<<""<<endl;
    
    	basis b1,b2,b3;								//objekte der basisklasse
    	abgeleitet a1,a2,a3;						//objekte der vererbten klasse
    
    	basis *zeig;								//definition des basisklassenzeigers zeig						
    	zeig=&b1;									//verweis des zeigers auf ein objekt der basisklasse
    	zeig->ausgabe();							//aufruf der virtuellen funktion
    
    	zeig=&b2;
    	zeig->ausgabe();
    
    	zeig=&b3;
    	zeig->ausgabe();
    
    	zeig=&a1;
    	zeig->ausgabe();
    
    	zeig=&a2;
    	zeig->ausgabe();
    
    	zeig=&a3;
    	zeig->ausgabe();
    
    	cout<<""<<endl;
    	cout<<"Ein neuer Zeiger mit Verweis auf die Basisklasse."<<endl;
    	cout<<""<<endl;
    
    	basis *ptr=new basis;						//definition des basisklassenzeigers ptr mit verweis auf die basisklasse
    	ptr->ausgabe();								//aufruf der virtuellen funktion
    
    	ptr=&a3;
    	ptr->ausgabe();
    
    	ptr=&b1;
    	ptr->ausgabe();
    	cout<<""<<endl;
    }
    

    mfg rum


Anmelden zum Antworten