2011-08-30 20 views
15

Zgodnie z tym, co przeczytałem, wykonywanie niewłaściwego dynamicznego przetwarzania w czasie wykonywania może albo zrzucić wyjątek bad_cast albo zwrócić zero.Jak kończy się niepowodzenie dynamic_cast?

Czy to prawda, że ​​powróci do zera, jeśli rzucasz wskaźniki?

tj:

class Base { virtual void a(){} }; 
class Derived: public Base {}; 

int main() { 
    Base *base = new Base(); 
    dynamic_cast<Derived*>(base); 
    return 0; 
} 

i że będzie rzucić bad_cast wyjątek podczas rzucania przedmiotów?

tj:

class Base { virtual void a(){} }; 
class Derived: public Base {}; 

int main() { 
    Base base; 
    Base& ref = base; 
    dynamic_cast<Derived&>(ref); 
    return 0; 
} 

Odpowiedz

26

dynamic_cast zwróci NULL na złą obsadą jeśli odlewania wskaźnik; rzuci std::bad_cast podczas odlewania referencji. Jest to błąd podczas kompilacji polegający na próbie oddania obiektów z dynamic_cast (np. Z dynamic_cast<Derived>(base))

+0

OK, więc afirmacja jest prawidłowa. Dzięki. Edytowałem komunikat, aby uczynić klasę podstawową polimorficzną (dodając funkcję wirtualną) i używając rzutowania referencyjnego, aby wyjątek mógł zostać zgłoszony. – NIGO

Powiązane problemy