Announcement

Collapse
No announcement yet.

dynamic_cast and Abstrakte Klasse (Interface)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • dynamic_cast and Abstrakte Klasse (Interface)

    Hello,

    Ich habe folgende Problematik Ich habe zwei Abstrakte Klassen wo einer von der Anderen erbt um sie zu erweitern, wobei indiesem Beispiel die 1 Abstrakte Klasse leer ist, hat andere hintergründe, Von der Zweiten
    Abstrakte Klasse erben zwei verschieden Klassen A und B. Gesagt sei das die zweite Abstrakte klasse eine voll virtuelle Funktion hat.

    Jetzt hatte ich in meinem eigentlichem Projekt vor einen dynamic_cast durch zu führen. Der Code Zeigt was ich meine:

    Code:
    class Interface
    {
    public:
       Interface(){}
    }
    
    
    class fooInterface
    {
    public:
        fooInterface(){}
    
    
        virtual int type() =0;
    }
    
    
    
    class A : public fooInterface
    {
    public:
    
    
    virtual int type(){return 1;}
    virtual void foo(A var){std::cerr<<var.type(); }
    };
    
    
    class B : public fooInterface
    {
    public:
    
    
    virtual int type(){return 2;}
    virtual void foo(B var){std::cerr<<var.type(); }
    };
    
    int main()
    {
       A TestOne;
       B TestTwo;
    
    
       TestOne.foo(*(dynamic_cast<A*>(&TestTwo)));
       TestTwo.foo(*(dynamic_cast<B*>(&TestOne)));
    
    
       return 0;
    
    
    }

    Output:
    1
    2

    Ich weiß jetzt natürlich durch Recherche solch ein dynamic_cast zum scheitern verurteilt ist da er eigentlich einen nullptr zurück liefern sollte aber dennoch läßt g++ den code zu baut ihn und er ist ausführbar.
    g++ spuckt nur folgende warnung aus:
    warning: dynamic_cast of 'B TestTwo' to 'class A*' can never succeed [enabled by default]
    warning: dynamic_cast of 'A TestOne' to 'class B*' can never succeed [enabled by default]

    Meine Frage die ich habe ist was könnt der Grund sein warum g++ den code so durchgehen lässt? Ich kann das leider nicht ganz nachvollziehen.
    Anhand des Outputs bzw dem Debugger kann man jedoch sehen das g++ Einfach die Objekt ihre Original funktion aufrufen lässt. Vielleicht macht
    er das hier weil Problemstellung noch "nicht" Komplex genug ist und er quasi den Fehler weg optimiert. Nachvollziehbar ist es leider für mich nicht...
    vielleicht hat hier jemand eine Vorstellung warum dies sich so hier verhält.


Working...
X