Muss ich dynamic_cast verwenden, wenn eine Funktion aufrufen, die die Basisklasse übernimmt?

StackOverflow https://stackoverflow.com/questions/1613706

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe einige Klassen wie folgt aus:

interface class IA
{
};

interface class IB
{
};

public ref class C : public IA, public IB
{
};

public ref class D
{
    void DoSomething(IA^ aaa)
    {
    }

    void Run()
    {
        C^ bob = gcnew C();
        DoSomething(dynamic_cast<IA^>(bob));    // #1
        DoSomething(bob);           // #2
    }
};

Im Moment versuche ich immer, dynamische Gießen zu verwenden, wenn eine solche Funktion aufrufen, (die # 1 oben).
Jedoch macht es der Code ziemlich hässlich machen, so möchte ich wissen, ob es wirklich notwendig ist.

Verwenden Sie auf diese Weise dynamic_cast? Wenn ja, was ist der Hauptgrund?

War es hilfreich?

Lösung

Da wir wissen, bob vom Typ C^ ist, wissen wir bei der Kompilierung kann es sicher IA^ downcasted werden, und so ist dynamic_cast äquivalent hier static_cast. Darüber hinaus ist die implizite Umwandlung Sie vorschlagen, ist auch sicher.

dynamic_cast wird nur dann benötigt, wenn die von einer Basistyp einer Upcasting abgeleitet.

Andere Tipps

In Standard-C ++ verwenden Sie dynamic_cast die Hierarchie hinunter, nicht auf. In diesem Fall würden Sie es verwenden, um ein IA oder IB in ein C zu versuchen und zu konvertieren:

IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);

Nein, ich würde denken, dass in C ++ / CLI Sie auch hier die dynamische Umwandlung nicht brauchen. Abgeleitet * konvertiert implizit auf Basis *, es sei denn es eine Mehrdeutigkeit ist w.r.t. Mehrfachvererbung. Das gleiche es wahrscheinlich gilt für „gc-Zeiger“. In C ++ eine dynamische Umwandlung - wenn Upcasting - polymorphe Klassen (mit mindestens einem virtuellen Funktion) erfordert. Ich weiß nicht, wie C ++ / CLI es behandelt, though. Ich würde denken, jede CLI-Klasse standardmäßig polymorph ist.

Sie können den C ++ Tag, durch die Art und Weise zu entfernen. ;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top