2009-08-10 32 views

Trả lời

29

Sử dụng dynamic_cast khi truyền từ loại lớp cơ sở sang loại lớp dẫn xuất. Nó kiểm tra rằng đối tượng đang cast thực sự thuộc kiểu lớp dẫn xuất và trả về một con trỏ null nếu đối tượng không thuộc kiểu mong muốn (trừ khi bạn đang truyền sang kiểu tham chiếu - sau đó nó ném một ngoại lệ bad_cast).

Sử dụng static_cast nếu không cần kiểm tra thêm. Như Arkaitz đã nói, vì dynamic_cast thực hiện kiểm tra bổ sung, nó yêu cầu thông tin RTTI và do đó có chi phí thời gian chạy lớn hơn, trong khi static_cast được thực hiện tại thời gian biên dịch.

+2

phôi động cũng có thể được sử dụng để truyền tham chiếu, trong trường hợp này, chúng ném ngoại lệ về lỗi truyền, thay vì trả về một điểm rỗng –

+0

dynamic_cast thậm chí có thể ném ngoại lệ vào thời gian chạy. –

+0

@Neil, Martin: cảm ơn, tôi đã chỉnh sửa câu trả lời của mình. –

2

Truyền động yêu cầu RTTI và thực hiện một số phép thuật so với phép đúc tĩnh. static_cast chỉ là một quá trình biên dịch thời gian, kiểm tra xem lớp gốc có thể được quảng bá cho lớp được đúc bởi một số quy tắc đơn giản như kế thừa hay không.

Ví dụ: trong trường hợp thừa kế ảo chỉ dynamic_cast có thể giải quyết tình huống.

Ngoài ra, dynamic_cast sẽ trả về NULL nếu không thể truyền, do đó bạn có thể đưa ra quyết định khác.

Mặt khác, dynamic_cast chậm hơn, vì nó ngụ ý một số mã đang được thực thi và như đã nói trước đó, cần bật RTTI làm tăng kích thước của tệp nhị phân.

+0

dynamic_cast thậm chí có thể ném ngoại lệ khi chạy. –

0

Nếu bạn đang nói về C++. Sau đó static_cast không phải là loại an toàn khi truyền. Nó có thể chuyển sang kiểu của bạn nhưng nếu nó sai, nó sẽ không ném bất kỳ lỗi/thông báo nào. Vì vậy, bạn sẽ nhận được đối tượng xấu từ đó. Và dynamic_cast là ném lỗi nếu đúc không thành công :) Hy vọng điều này sẽ giúp! :)

3

dynamic_cast kiểm tra thông tin có sẵn tại thời gian chạy, chẳng hạn như RTTI, nó cũng đi qua các phân cấp lớp để xem liệu có thể truyền như vậy hay không.

Kiểm tra C++ type casting tutorial at cplusplus.com

2

static_cast cũng tương tự như cũ cast C phong cách và có thể được áp dụng cho bất cứ thứ gì. static_cast sẽ được sử dụng khi bạn chắc chắn các loại được đề cập. Ví dụ: tôi thường sử dụng một số static_cast khi truyền giữa intenum.

dynamic_cast chỉ có thể được sử dụng với con trỏ và tham chiếu. Khi không truyền, một con trỏ null được trả về. dynamic_cast thường được sử dụng khi phân giải con trỏ đến các lớp được sử dụng trong kế thừa mà bạn muốn đảm bảo con trỏ bạn đang truyền là loại mong đợi.

Ngoài ra kiểm tra C++ : Documentation : C++ Language Tutorial : Type Casting

+2

những gì bạn nói về static_cast sẽ thực sự được nói chính xác hơn về reinterpret_cast –

+0

Tôi đồng ý với anon, reintepret_cast tương tự như dàn diễn viên kiểu C. – Aminos

2

đúc tĩnh được thực hiện bởi trình biên dịch: nó xử lý kết quả như các loại mục tiêu, không có vấn đề gì. Bạn làm điều này khi bạn hoàn toàn chắc chắn về đối số là loại mục tiêu.

Truyền động được thực hiện khi chạy và do đó yêu cầu thông tin loại thời gian chạy.Bạn làm điều này khi bạn không chắc chắn về loại bạn có: các diễn viên có thể thất bại, được hiển thị bởi giá trị trả về là null. Nó cũng chỉ có thể được thực hiện cho con trỏ và tham chiếu.

7

Trong một số ngữ cảnh, như thế này, "tĩnh" đề cập đến thời gian biên dịch và "động" đề cập đến thời gian chạy.

Để kiểm tra thời gian biên dịch, hãy sử dụng static_cast (giới hạn những gì trình biên dịch biết). Để kiểm tra thời gian chạy, hãy sử dụng dynamic_cast (giới hạn đối với các lớp học có RTTI). Để không kiểm tra, hãy sử dụng reinterpret_cast.

Các vấn đề liên quan