Tôi đồng ý với câu trả lời của @ j6t, nhưng đây là một lý do mở rộng với các tài liệu tham khảo tiêu chuẩn.
Hành vi đặc biệt của dynamic_cast
các đối tượng đang được xây dựng và phá hủy được mô tả bởi [class.cdtor] / 5 của tiêu chuẩn C ++ 17 (bản nháp cuối cùng) và tương đương bởi các phiên bản tiêu chuẩn trước đó.
Cụ thể nó nói:
Khi a dynamic_cast
được sử dụng [...] trong một hàm hủy, [...], nếu toán hạng của tham chiếu dynamic_cast
đến đối tượng đang được xây dựng hoặc phá hủy, đối tượng này được coi là một đối tượng dẫn xuất nhất có loại [ ...] Lớp hủy diệt. Nếu toán hạng của tham chiếu dynamic_cast
đến đối tượng bị phá hủy [...] và kiểu tĩnh của toán hạng không phải là con trỏ tới hoặc đối tượng của lớp riêng của hàm hủy [hoặc] hoặc một trong các cơ sở của nó, thì Dynamic_cast sẽ dẫn đến hành vi không xác định.
Hành vi không xác định không áp dụng ở đây, vì toán hạng là biểu thức this
, mà tầm thường có loại con trỏ đến lớp riêng của hàm hủy vì nó xuất hiện trong chính hàm hủy.
Tuy nhiên, câu đầu tiên nói rằng ý dynamic_cast
chí hành xử như thể *this
là một đối tượng xuất phát nhất của loại Base2
và do đó, diễn viên Base1
không bao giờ có thể thành công, vì Base2
không xuất phát từ Base1
và dynamic_cast<Base1*>(this)
sẽ luôn trả về một con trỏ rỗng, dẫn đến hành vi bạn đang thấy.
cppreference.com nói rằng hành vi không xác định xảy ra nếu loại đích của diễn viên không phải là loại của hàm hủy hoặc một trong các cơ sở của nó, thay vì áp dụng điều này cho loại toán hạng. Tôi nghĩ rằng đó chỉ là một sai lầm. Có lẽ việc đề cập đến " loại mới " trong gạch đầu dòng 6 được cho là nói " biểu hiện ", điều này sẽ làm cho nó phù hợp với cách giải thích của tôi ở trên.