Frage zu Code



  • #include <iostream>
    
    using namespace std;
    
    class A{
    
    public:
    	 void foo(){};
    
    };
    
    class B:A{
    public:
    	 void foo(){cout<<"Das ist Klasse B";};
    
    };
    
    void main(void)
    {
    
    B* x=new A;  //Warum geht das nicht ???? 
    
    }
    

  • Mod

    Weil B ein A ist, aber A ist kein B.



  • A* x=new B;
    

    Das geht aber auch nicht



  • ich versteh das nicht.

    A ist vollständig in B enthalten.

    Also wieso kein Zeiger B* ptr=new A;

    Macht das keinen Sinn ? versteh ich nicht .



  • blurry333 schrieb:

    A* x=new B;
    

    Das geht aber auch nicht

    Mach mal public-Vererbung:

    ...
    class B : public A{
    ...
    


  • blurry333 schrieb:

    ich versteh das nicht.

    A ist vollständig in B enthalten.

    Also wieso kein Zeiger B* ptr=new A;

    Macht das keinen Sinn ? versteh ich nicht .

    Jedes B ist ein A aber nicht jedes A ist ein B. Damit kann ich einen Zeiger auf B auch einem Zeiger auf A zuweisen aber nicht umgekehrt.

    Oder anders: wenn Du über ptr, welches ein Zeiger auf B ist, auf Eigenschaften zugreifen möchtest, die in B sind, aber nicht in A, dann kann es nicht gehen, wenn es auf eine Instanz vom Typ A zeigen würde.



  • tntnet schrieb:

    Jedes B ist ein A aber nicht jedes A ist ein B.

    Mit der nichtöffentlichen Vererbung ist ein B nur für Freunde von B auch ein A 🙂 (Um die Verwirrung mal komplett zu machen)



  • blurry333 schrieb:

    A ist vollständig in B enthalten.

    Soweit richtig. Sehr vereinfach dargestellt:

    Klasse B:          Klasse A:
    
    <A-Anteil>         <A-Anteil>
    <B-Anteil>
    

    blurry333 schrieb:

    Also wieso kein Zeiger B* ptr=new A;

    Weil ein B-Zeiger auch erwartet, das es einen B-Anteil gibt.

    Umgekehrt (mit public-Vererbung und möglichst virtuellen Destruktor [Das ist aber ein anderes Thema]) ist es wiederum möglich, da ein Zeiger auf A einen A-Anteil erwartet und B diesen besitzt.



  • #include <iostream>
    
    using namespace std;
    
    class A{    //Person
    
    public:
    	 void foo(){};
    
    };
    
    class B:public A{                 //Mitarbeiter
    public:
    	 void foo(){cout<<"Das ist Klasse B";};
    
    };
    
    void main(void)
    {
    
    A* x=new B; //funktioniert
    B* y=new A; // funktioniert nicht, 
                //Aber jeder Mitarbeiter ist doch eine Person ?
    
    }
    


  • aso asc



  • mit diesem Zeigerkonzept ist es mir eh ungeheuerlich

    ich frage mich warum ein zeiger einen Typ hat.

    Warum nicht jeden Zeiger auf alles zeigen lassen.

    Schließlich hat er immer 4 Byte gespeichert



  • Warum ist A* x=new A;

    class A{    
    
    public:
    	 void foo(){};
    
    private:
    
    	int x;
    	char k;
    
    };
    

    sizeof(x) ist 8Byte : also int = 4 Byte und char = 1 Byte . Wieso also 8 Byte ?



  • Weil man nicht ohne weiteres 1 Byte an Speicher anfordern kann. 4 Byte = 32bit. 😉

    Mach aus k ein char Array (char k[4]) und guck nochmal.



  • blurry333 schrieb:

    A* x=new B; //funktioniert
    B* y=new A; // funktioniert nicht, 
                //Aber jeder Mitarbeiter ist doch eine Person ?
    

    Aber nicht alle Personen sind Mitarbeiter. Und genau dagegen verstößt du im zweiten Fall.



  • ich frage mich warum ein zeiger einen Typ hat.

    Damit der Compiler bei Zeigerarithmetik weiß was für ein Typ hinter dem Zeiger steckt. Damit kann man ein paar Sicherheitsüberprüfungen einbauen.



  • blurry333 schrieb:

    Warum nicht jeden Zeiger auf alles zeigen lassen.

    C++ ist eine Typsichere Sprache und wenn so etwas erlaubt wäre, könnte man gleich alle Typen weglassen und dann hätten wir sehr viel Laufzeitoverhead, weil dann erst bestimmt wird, was für Methoden überhaupt aufgerufen werden können. (Aber da kann man dann gleich Python o.ä. her nehmen und braucht kein C++ mehr).

    Zusätzlich zum Sicherheitsaspekt gibts natürlich auch noch Performance Sachen, die man ohne den genauen Typen zur Kompilierzeit zu kennen nicht möglich wären.


Anmelden zum Antworten