Durch Basisklasse auf abgeleitete Klasse zugreifen



  • Hallo!

    Seit Tagen zerbreche ich mir den Kopf darüber wie eine solches Problem gelöst werden kann. Ich hoffe jemand da draußen kann mir irgendwie helfen 🙂

    Am Code darf nicht verändert werden: Alle Klassen, die Funktion printData

    [cpp]
    #include <iostream>
    using namespace std;
    
    enum classType {basisclass, classA, classB}; // Hiermit wird unterschieden um welche Klasse es sich handelt.
    
    class Basisklasse {
    int foo;
    public:
    	Basisklasse(int f=0) {foo=f;typ=basisclass;}
    	void printBasis() {cout << "foo: " << foo << endl;} // Die Methode welche aufgerufen werden soll
    	classType typ;
    };
    
    class A : public Basisklasse {
    int x;
    public:
    	A(int f=0) {x=f;typ=classA;}
    	void printA() {cout << "x: " << x << endl;} // Die Methode welche aufgerufen werden soll
    };
    
    class B : public Basisklasse {
    int y;
    public:
    	B(int f=0) {y=f; typ=classB;}
    	void printB() {cout << "y: " << y << endl;} // Die Methode welche aufgerufen werden soll
    };
    
    void printData(Basisklasse *basisPtr) {
    /*
    Hier soll mittels basisPtr->typ entschieden werden um welchen Klassentyp es sich handelt, um dann die jeweilige Methode aufzurufen. z.B.:
    if(basisPtr->typ==classA) {
    	// Hier soll nun die Funktion printA() aus der Klasse A aufgerufen werden
    }
    */
    }
    
    int main() {
    /* Hier ist alles variabel */
    }
    [/cpp]
    

    Ich hoffe durch die Kommentare in der printData Funktion ist die Problemstellung klar.

    Vielleicht ist es auch sehr einfach zu lösen, und ich habe einfach nur ein Brett vor dem Kopf.
    Jedenfalls bin ich über jeden Hinweis dankbar!



  • Wo wird eigentlich "typ" deklariert? Wie auch immer, virtual ist die Lösung: http://ideone.com/hsnPN

    #include <iostream>
    #include <memory>
    
    class A
    {
    public:
      virtual ~A()
      {}
      virtual void foo()
      {
        std::cout << "foo A\n";
      }
    };
    
    class B : public A
    {
    public:
      virtual void foo()
      {
        std::cout << "foo B\n";
      }
    };
    
    void print(A *a)
    {
      a->foo();
    }
    
    int main()
    {
      std::unique_ptr<B> p(new B);
      print(p.get());
    }
    


  • Du könntest ganz THEORETISCH auch typeid(objekt) == typeid(Klassenname) machen, natürlich ist die Version von PI cooky451 allerdings sehr viel besser.



  • Hacker schrieb:

    natürlich ist die Version von PI allerdings sehr viel besser.

    Ich bin doch keine Zahl. -.-



  • cooky451 schrieb:

    Hacker schrieb:

    natürlich ist die Version von PI allerdings sehr viel besser.

    Ich bin doch keine Zahl. -.-

    Ups, die von Cooky :xmas1:

    Edit: und nochwas: Wenn du einen basisklassenpointer hast, wird der auch dereferenziert nix als als public deklarierte Basisklassenmember behandeln könn'n 😉



  • @cooky: Da fehlt der virtuelle Dtor.



  • 314159265358979 schrieb:

    @cooky: Da fehlt der virtuelle Dtor.

    Gerade korrigiert. 😉



  • Hi, erstmal danke für die Hilfe!

    Zur Lösung des Problems hat es allerdings gehört dass die Klassen nicht verändert werden dürfen. Hätte ich vielleicht noch klarer ausdrücken sollen.

    Jedenfalls kam ich auf eine, wenn auch nicht schöne, Lösung.

    Durch eine explizite Typenumwandlung ist es möglich:

    [cpp]
    void printData(Basisklasse *basisPtr) {
    if(basisPtr->typ==classA) {
    	( (A* )basisPtr)->printA(); break;
    }
    //etc.
    }
    int main() {
    Basisklasse *basisPtr;
    A objA;
    basisPtr = &objA;
    printData(basisPtr);
    return 0;
    }
    [/cpp]
    

    Falls ihr noch andere Lösungen kennt würde ich sie dennoch gerne hören 🙂



  • Wo kommt die Aufgabe denn her? Klingt nach ziemlich miesem Lehrmaterial.



  • Du kannst keine Funktion einer Abgeleiteten Klasse mit einem Basisklassenzeiger aufrufen. 'S geht einfach nicht. 😉


Anmelden zum Antworten