2011-01-16 15 views

Antwort

9

C ist definiert als von A vererben, so gibt es keine Notwendigkeit zu überprüfen:

Es ist zwingend notwendig, dass eine Instanz von C ist auch ein A (und ein B).

Wenn Sie jedoch eine Funktion haben, einen A als Parameter nehmen, können Sie dynamic_cast<> überprüfen verwenden, wenn die Instanz tatsächlich ein C ist:

void function(const A& a) 
{ 
    const C* c = dynamic_cast<const C*>(&a); 

    if (c) 
    { 
    // a is an instance of C and you can use c to call methods of C 
    } else 
    { 
    // a is not an instance of C. 
    } 
} 

Für diese Arbeit jedoch der Basisklasse Typ muss polymorphe (es muss zumindest eine virtuelle Methode haben).

+0

Ich lief 'const C * c = dynamic_cast (& a) 'aber es gab mir' Fehler: kann nicht dynamic_cast '& a' (vom Typ 'Klasse A *') 'const Klasse C *' eingeben (Quellentyp ist nicht polymorph) ' – Barney

+1

@BarneyHsiao: Ich aktualisierte die Antwort zu erklären, warum Sie erhalten diesen Fehler. Kurz gesagt, die Basisklasse muss mindestens eine virtuelle Methode haben (es kann der Destruktor sein), wenn Sie 'dynamic_cast <>' darauf verwenden wollen. – ereOn

3

Die einzige Zeit, die Sie dazu benötigen, ist während der Kompilierungszeit, da die implizite Konvertierung überall sonst funktioniert. Aber wenn Sie sehen wollen, wenn ein Typ T eine Basis eines Typs ist S dann können Sie SFINAE (oder benutzen Sie einfach is_base_of <>):

template < typename T, typename S > 
struct is_base_of // checks if T is a base of S 
{ 
    typedef char (yes&) [1]; 
    typedef char (no&) [2]; 

    void yes check(T*); 
    void no check(...); 

    enum { value = sizeof(check(static_cast<S*>(0))) == sizeof(yes); } 
}; 
Verwandte Themen