2014-06-10 26 views
6

Dlatego mam klasy i chcę ustalić, czy ma on funkcję wirtualną, czy nie.Czy zajęcia mają funkcję wirtualną? C++

Pierwszy sposób, jaki należy rozważyć za pomocą dynamicznej obsady.

class A 
{ 
// hidden details.. 
}; 

class B:public A{}; 

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

Więc w tym przypadku, jeśli istnieje funkcja wirtualnego w klasie A, kompilacji uda, inaczej, ten błąd będzie występować:

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

Czy istnieje sposób, aby to sprawdzić bez kompilacji błędu ? UWAGA: Nie mam obsługi C++ 11 lub boost!

+0

Zobacz tutaj: http://stackoverflow.com/questions/1107948/test-whether-a-class-is-polymorphic std :: is_polymorphic to, co chcesz. – paulm

+4

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

+0

jest to obsługiwane od wersji C++ 11, jeśli się nie mylę, co zrobić, jeśli nie mam takiego wsparcia? –

Odpowiedz

8

Można testować istnienie metod wirtualnych, porównując rozmiar typu z rozmiarem typu z dodaną metodą wirtualną. Ten typ kontroli nie jest gwarantowany przez standard i może zostać zmylony przez dziedziczenie wirtualne, więc nie powinien być używany w kodzie produkcyjnym. Jednak nadal może być przydatny w prostych przypadkach, w których C++ 11 std::is_polymorphic jest niedostępny. Testowany pod 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>); 
} 

powołać test jako has_virtual<A>().

+0

Co się stanie, jeśli typ T nie ma publicznego konstruktora? –

+0

@EduardRostomyan Nie ma problemu - 'has_virtual ' nigdy faktycznie nie próbuje skonstruować 'T'. – user4815162342

+0

Proszę wyjaśnić, dlaczego nie jest skonstruowany? –