2014-09-01 13 views
24

5.2.7/7 nói cái gì đó dọc theo dòng:Khi nào dynamic_cast <void*> hữu ích?

Nếu T là "con trỏ đến cv void", kết quả là một con trỏ tới lớp được thừa kế hầu hết được trỏ đến bởi x.

Ứng dụng tốt của synatx này là gì? Khi nào nên sử dụng dynamic_cast<void*>?

+0

Dưới đây là một ví dụ về những gì MSalters được mô tả: http://ideone.com/84U5ax –

+0

Tôi nghĩ allocators có thể tận dụng điều này (quản lý bộ nhớ). Ví dụ. nếu bạn cần địa chỉ bắt đầu của một khối bộ nhớ, nhưng bạn chỉ có một con trỏ đến một lớp cơ sở. – dyp

+0

@dyp: Nếu bạn đã có một đối tượng, bộ nhớ của nó phải đã được cấp phát, do đó, người cấp phát không thể phân bổ lại điều đó. Và đối với deallocation bạn cần nhiều hơn chỉ là địa chỉ cơ sở, bạn cần loại có nguồn gốc cao nhất để bạn có thể chạy tất cả các destructors. – MSalters

Trả lời

26

Một lý do phổ biến là để tìm hiểu xem hai giao diện IA*IB* có trong thực tế con trỏ đến cùng một đối tượng cơ bản không. Nếu bạn cần điều đó, hãy sử dụng dàn diễn viên.

IIRC, thậm chí có thể trong trường hợp Thừa kế nhiều với cơ sở phi ảo lặp lại để có hai con trỏ IA* so sánh không bằng nhau, nhưng trỏ đến cùng một đối tượng - vì chúng trỏ đến hai khác nhau là IA subobject.

+1

Tôi không hiểu sự khác biệt giữa 'dynamic_cast (ptr)' và 'static_cast (ptr)' (vì 'void *' không có bất kỳ RTTI hoặc vtable nào) .... –

+0

@BasileStarynkevitch 'ptr' là một con trỏ đến loại lớp, vì vậy nó có thể có RTTI. – Oktalist

+0

Vì vậy, cái gì, 'void *' là một con trỏ chung nên không có RTTI, IMHO. –

5

Khi bạn có một cái gì đó như:

template<typename X, typename Y> 
bool operator==(const X* px, const Y* py) { 
    return dynamic_cast<void*>(px) == dynamic_cast<void*>(py); 
} 
+1

Không có một 'trở lại 'thừa ở đây? – Morwenn

+0

Và bạn đang bỏ đi 'const'. – Oktalist

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