2014-06-10 11 views
6

Quindi ho una classe, e voglio determinare se ha una funzione virtuale o meno.La classe ha una funzione virtuale? C++

Il primo modo di fare è considerato dal cast dinamico.

class A 
{ 
// hidden details.. 
}; 

class B:public A{}; 

int main() 
{ 
    A *a = new A;; 
    B* b = dynamic_cast<B*>(a); 
} 

Quindi, in questo caso, se c'è una funzione virtuale nella classe A, la compilazione avrà successo, in caso contrario, si verificherà questo errore:

error: cannot dynamic_cast \u2018a\u2019 (of type \u2018class A*\u2019) to type \u2018class B*\u2019 (source type is not polymorphic)

C'è un modo per verificare questo senza errore di compilazione ? NOTA: non ho supporto per C++ 11 o boost!

+0

vedere qui: http://stackoverflow.com/questions/1107948/test-whether-a-class-is-polymorphic std :: is_polymorphic è ciò che si desidera. – paulm

+4

Vedere ['std :: is_polymorphic'] (http://en.cppreference.com/w/cpp/types/is_polymorphic). – juanchopanza

+0

questo è supportato da C++ 11 se non sbaglio, cosa fare se non ho ottenuto tale supporto? –

risposta

8

È possibile verificare l'esistenza di metodi virtuali confrontando la dimensione del tipo con la dimensione del testo con un metodo virtuale aggiunto. Questo tipo di controllo non è garantito dallo standard e può essere ingannato dall'eredità virtuale, quindi non dovrebbe essere utilizzato nel codice di produzione. Tuttavia, può comunque essere utile in casi semplici in cui C++ 11 std::is_polymorphic non è disponibile. Prove effettuate in g ++ 4.6:

template<typename T> 
class VirtualTest: private T { 
    virtual void my_secret_virtual(); 
}; 

template<typename T> 
bool has_virtual() { 
    return sizeof(T) == sizeof(VirtualTest<T>); 
} 

invocare il test come has_virtual<A>().

+0

Cosa succede se il tipo T non ha un costruttore pubblico? –

+0

@EduardRostomyan Nessun problema - 'ha_virtuale ' mai effettivamente tenta di costruire 'T'. – user4815162342

+0

Per favore, potresti spiegare perché non è stato costruito? –