2011-08-30 32 views
15

Theo những gì tôi đọc, thực hiện một dynamic_cast thời gian chạy sai có thể ném một ngoại lệ bad_cast hoặc trả về số không.Dynamic_cast thất bại như thế nào?

Có đúng không khi nói rằng nó sẽ trả về 0 nếu bạn đang truyền con trỏ?

tức là:

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

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

Và rằng nó sẽ ném một ngoại lệ bad_cast khi đúc đối tượng?

tức là:

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

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

Trả lời

26

dynamic_cast sẽ trở lại NULL trên một dàn diễn viên xấu nếu bạn đang đúc một con trỏ; nó sẽ ném std::bad_cast khi truyền tài liệu tham khảo . Đó là một lỗi thời gian biên dịch để cố gắng đúc đối tượng với dynamic_cast (ví dụ, với dynamic_cast<Derived>(base))

+0

Ok, do đó khẳng định là đúng. Cảm ơn. Tôi đã chỉnh sửa thông điệp để làm cho lớp đa hình cơ sở (thêm chức năng ảo) và sử dụng phép đúc tham chiếu để loại bỏ ngoại lệ. – NIGO