(Lưu ý rằng class
không phải là tên biến hợp lệ vì đó là từ khóa. Tôi sẽ gọi nó là c
thay thế).
Có an toàn khi xóa con trỏ sau khi dynamic_casting không?
Có; nhưng hãy cẩn thận rằng cả hai con trỏ đều không hợp lệ sau khi xóa đối tượng mà chúng trỏ đến. Bạn không thể sử dụng giá trị con trỏ sau đó.
Nói chung, dynamic_cast thực sự hoạt động như thế nào?
Nó chuyển đổi con trỏ hoặc tham chiếu đến loại lớp thành con trỏ hoặc tham chiếu đến loại lớp khác, với kiểm tra thời gian chạy để chuyển đổi hợp lệ. Trong trường hợp này, diễn viên sẽ thành công (đưa ra một con trỏ hợp lệ) nếu BaseClass
giống như, hoặc một lớp cơ sở của, kiểu động của đối tượng. Nó sẽ thất bại (đưa ra một con trỏ null) nếu không.
Nếu bạn đang đúc *c
thành loại tham chiếu, thì lỗi sẽ gây ra ngoại lệ (std::bad_cast
), vì không có tham chiếu null nào.
nó hoạt động như một nhà xây dựng sao chép?
No. Sao chép trình tạo để sao chép đối tượng. Đây không phải là sao chép nó, chỉ cần thay đổi loại của một con trỏ trỏ đến nó. Một bản sao sẽ trông như thế
BaseClass bc = *c;
Lưu ý rằng loại bc
là BaseClass
, không phải là loại c
(đó là đoán được một lớp học có nguồn gốc từ BaseClass
); điều này được gọi là "cắt", vì phần có nguồn gốc của đối tượng bị "cắt đứt" và không được sao chép.
Nguồn
2013-11-20 15:52:57
Nếu bạn làm muốn có một bản sao (và giả sử BaseClass thực sự là một lớp cơ sở) sau đó 'BaseClass bc = * lớp; ' – john
Nếu' BaseClass' là thực sự là một lớp * base *, thì điểm đó là gì 'dynamic_cast' ??? Hoặc bất kỳ diễn viên nào cho vấn đề đó? – AnT