Ich blicke das nicht! Bitte um hilfe :)



  • Also ich habe hier ein Programm das ich schreiben muss 1 x Mit Virutal und einmal ohne !

    So jetzt habe ich das Programm mit:

    // Uebung6.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Verwalter
    {
    private:
    	char *m_p_name;
    public:
    	Verwalter(char *p_name)
    	{
    		m_p_name = new char[strlen(p_name)+1];
    		if(m_p_name ==0)
    		{
    			cout <<"kein Platz";
    		}
    		else
    		{
    			strcpy(m_p_name,p_name);
    		}
    	}
    	char *gibName(){return (char*)m_p_name;}
    	~Verwalter()
    	{
    		if(m_p_name !=0)
    		{
    			delete [] m_p_name;
    			m_p_name = 0;
    		}
    	}
    
    };
    
    class Gebaeude
    {
    private:
    	char * m_p_gebaeudenr;
    	int m_preis;
    	Verwalter *m_p_verwalter;
    public:
    	Gebaeude(Verwalter *p_verwalter,char *p_gebaeudenr,int preis)
    	{
    		m_p_verwalter = new Verwalter(p_verwalter->gibName());
    		m_p_gebaeudenr = new char[strlen(p_gebaeudenr)+1];
    
    		if(m_p_gebaeudenr==0)
    		{
    			cout <<"Kein Platz!";
    		}
    		else
    		{
    			strcpy(m_p_gebaeudenr,p_gebaeudenr);
    		}
    		m_preis = preis;
    	}
    
    	virtual int gibPreis()
    	{
    		return m_preis;
    	}
    	virtual char *gibNummer()
    	{
    		return (char*)m_p_gebaeudenr;
    	}
    	virtual void zeigeAlleAttribute()
    	{
    		cout <<"\nNummer:  "<<gibNummer()<<"\nPreis:  "<<gibPreis()
    			<< "\nVerwalter:  " << m_p_verwalter->gibName();
    	}
    	virtual char *gibNameVerwalter()
    	{
    		return m_p_verwalter->gibName();
    	}
    	virtual ~Gebaeude()
    	{
    		if(m_p_verwalter !=0)
    		{
    			delete m_p_verwalter;
    			m_p_verwalter =0;
    		}
    		if(m_p_gebaeudenr !=0)
    		{
    			delete m_p_gebaeudenr;
    			m_p_gebaeudenr =0;
    		}
    	}
    
    };
    class Mehrfamilienhaus : public Gebaeude
    {
    private:
    	int m_anzWohnungen;
    	char *m_p_verkaufMoeglich;
    public:
    	Mehrfamilienhaus(Verwalter *p_v,char *p_gebaeudenr,int preis,int anzWohnungen,char *p_verkaufMoeglich):
    	  Gebaeude(p_v,p_gebaeudenr,preis)
    	{
    		m_anzWohnungen = anzWohnungen;
    		m_p_verkaufMoeglich = new char [strlen(p_verkaufMoeglich)+1];
    
    		if(m_p_verkaufMoeglich ==0)
    		{
    			cout <<"Kein Platz";
    		}
    		else
    		{
    			strcpy(m_p_verkaufMoeglich,p_verkaufMoeglich);
    		}
    
    	}
    	int gibAnzWohnungen()
    	{
    		return m_anzWohnungen;
    	}
    	void zeigeAlleAttribute()
    	{
    		bool b;
    		Gebaeude::zeigeAlleAttribute();
    
    		cout << "\nAnzWohnungen    :" <<gibAnzWohnungen()
    			<< "\nVerkaufMoeglich:";
    
    		b=m_p_verkaufMoeglich;
    		if(b=true)
    		{
    			cout <<"ja";
    		}
    		else
    		{
    			cout<<"nein";
    		}
    	}
    	bool verkaufMoeglich()
    	{
    		int moeglich = strcmp(m_p_verkaufMoeglich,"ja");
    		if(moeglich == 0)
    		{
    			return true;
    		}
    		else 
    		{
    			return false;
    		}
    	}
    	~Mehrfamilienhaus()
    	{
    		Gebaeude::~Gebaeude();
    		if(m_p_verkaufMoeglich)
    		{
    			delete [] m_p_verkaufMoeglich;
    			m_p_verkaufMoeglich =0;
    		}
    	}
    };
    class Einfamilienhaus : public Gebaeude
    {
    private:
    	int m_qm;
    	int m_anzZimmer;
    public:
    	Einfamilienhaus(Verwalter *p_v,char *p_gebaeudenr,int Preis,int qm,int anzZimmer):
    	  Gebaeude(p_v,p_gebaeudenr,Preis)
    	{
    		m_qm = qm;
    		m_anzZimmer = anzZimmer;
    	}
    	int gibQm()
    	{
    		return m_qm;
    	}
    	int gibAnzZimmer()
    	{
    		return m_anzZimmer;
    	}
    	void zeigeAlleAttribute()
    	{
    		Gebaeude::zeigeAlleAttribute();
    		cout << "\nQm   :" <<gibQm() <<"\nAnzZimmer:"<<gibAnzZimmer();
    	}
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Verwalter v("max");
    	Verwalter *p_v = &v;
    
    	Gebaeude *gebaeude1 = new Mehrfamilienhaus(p_v,"17A",200000,3,"ja");
    	gebaeude1->zeigeAlleAttribute();
    
    	cout <<endl;
    
    	gebaeude1 = new Einfamilienhaus(p_v,"15",120000,200,4);
    	gebaeude1->zeigeAlleAttribute();
    
    	return 0;
    }
    

    **Und jetzt soll ich das Programm ohne Virtual schreiben.
    Was muss ich verändern ?

    Ich habe gedacht wenn ich die zeigeAlleAttribute verändere also anderes nenne und dann einfach in der Main zusätzlich aufrufe dann würde das klappen aber nichts geht da kommt immer XX ist nicht Element von Gebaeude.

    Ich weiß nicht genau wie ich das ohne virtual hinbekommen soll.

    Vielen dank schon mal !

    MFG,
    Matthias**

    <mod>Das nächste Mal bitte Code-Tags verwenden!</mod>



  • Man könnte jetzt genau das, was virtual macht, nachprogrammieren. Aber ich denke das ist nicht der Sinn der Aufgabe. Man soll einfach nur erkennen, warum hier virtual nötig ist, damit alles wie gedacht funktioniert.

    BTW: ungarische Notation und dt. ist immer gut... 😎

    Bye, TGGC (Der Held lebt!)



  • Dieses Virtual ist doch dafür zuständig das die wenn die Klasse vererbt wird die Elementmethoden nicht überschrieben werden oder ?

    mit virutal kann also jede methode das geerbte + eigene Sachen haben.

    Wie ist das eigentlich wenn ich von einer Basis Klasse was vererbe und die methode heißt genau gleich wie in meiner abgeleiten klasse dann müsste doch das nur von der Basis Klasse zählen oder ?

    Und noch was in diesem Programm wird ja mit :: in der Methode gearbeitet das bedeutet ja nichts anderes wie das diese Methode wieder public wird oder ?

    Hätte man das auch mit using machen können !

    MFG,
    Mattthias



  • Hallo,

    Thx-Blue schrieb:

    Dieses Virtual ist doch dafür zuständig das die wenn die Klasse vererbt wird die Elementmethoden nicht überschrieben werden oder ?

    Mhhh....eigentlich gehts eben genau darum, dass wenn eine Funktion virtual ist, sie in der abgeleiteten Klasse überschrieben werden kann.

    mit virutal kann also jede methode das geerbte + eigene Sachen haben.

    Jede Klasse. Entweder du überschreibst eine Methode oder nicht, aber du kannst dir nicht die besten Sachen rauspicken.

    Wie ist das eigentlich wenn ich von einer Basis Klasse was vererbe und die methode heißt genau gleich wie in meiner abgeleiten klasse dann müsste doch das nur von der Basis Klasse zählen oder ?

    Probiers doch einfach aus...

    Und noch was in diesem Programm wird ja mit :: in der Methode gearbeitet das bedeutet ja nichts anderes wie das diese Methode wieder public wird oder ?

    Hätte man das auch mit using machen können !
    Mattthias

    Ist das jetzt ne Frage oder ne Feststellung? Auch das könnteste ja einfach mal probieren und gucken was passiert....



  • Thx-Blue schrieb:

    Dieses Virtual ist doch dafür zuständig das die wenn die Klasse vererbt wird die Elementmethoden nicht überschrieben werden oder ?

    virtual sorgt dafür, dass die richtigen methoden aufgerufen werden, wenn z.b. ein basisklassen-pointer auf ein instanz der abgeleiteten klasse gerichtet wurde.

    Wie ist das eigentlich wenn ich von einer Basis Klasse was vererbe und die methode heißt genau gleich wie in meiner abgeleiten klasse dann müsste doch das nur von der Basis Klasse zählen oder ?

    kommt drauf an, wie du es verwendest. siehe virtual.

    Und noch was in diesem Programm wird ja mit :: in der Methode gearbeitet das bedeutet ja nichts anderes wie das diese Methode wieder public wird oder ?

    nein, das bedeutet, dass man auf einen bestimmten scope zugreift.

    Hätte man das auch mit using machen können !

    man greift zwar mit :: auf bestimmte scopes zu, allerdings auf verschieden arten. using greift auf namespaces zu, während in klassen bestimmte methoden aufgerufen werden.

    mfg


Anmelden zum Antworten