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_castcá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_castchí hành xử như thể *thislà một đối tượng xuất phát nhất của loại Base2và do đó, diễn viên Base1không bao giờ có thể thành công, vì Base2không xuất phát từ Base1và 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.