thể trùng lặp:
C++ equivalent of instanceofC++ dynamic_cast vs typeid để so sánh lớp
tôi đã tự hỏi những gì là sự khác biệt giữa dynamic_cast và typeid là liên quan đến so sánh chỉ lớp (ngoài dynamic_cast cho phép truy cập vào các phương thức của lớp con và loại id chỉ hữu ích cho việc so sánh lớp). Tôi đã tìm thấy StackOverflow hai tuổi hỏi cùng một câu hỏi: C++ equivalent of instanceof. Tuy nhiên, đó là hai tuổi và tôi không muốn necro một bài cũ (và tôi không chắc chắn khi typeid xuất hiện), vì vậy tôi nghĩ lại hỏi cùng một câu hỏi với một sự khác biệt nhỏ. Về cơ bản, tôi có lớp A và lớp B, cả hai đều là lớp con của lớp trừu tượng C. Lớp C được lấy làm tham số cho một phương thức và tôi muốn xác định xem lớp C có thực sự là lớp A hay lớp B hay không. Cả hai typeid và dynamic_cast hoạt động đúng cách vì vậy đây là câu hỏi về thực hành/hiệu suất tốt nhất. Tôi đoán:
A* test = dynamic_cast<A*> someClassCVar
if (test != 0) { //it is of class A }
HOẶC
if (typeid(someClassCVar) == typeid(A)) {
//it is of class A
}
EDIT: Xin lỗi, tôi quên bao gồm chút thông tin này. Tài liệu ActiveMQ CMS nêu rõ sử dụng dynamic_cast, nhưng tôi nghĩ rằng đó là chỉ vì nó giả sử người dùng sẽ muốn truy cập các phương thức cụ thể cho lớp con. Đối với tôi, dường như typeid sẽ là hiệu suất tốt hơn nếu chỉ so sánh đẳng cấp là cần thiết: http://activemq.apache.org/cms/cms-api-overview.html
Tôi muốn nói 'cái dynamic_cast' là được ưa thích, nhưng tôi không có nguồn để sao lưu của tôi ý kiến. – Constantinius
'dynamic_cast someClassCVar' sẽ trả về giá trị không null nếu' someClassCVar' là một con trỏ tới 'A' hoặc bất kỳ phần tử con nào của' A'. 'typeid (someClassCVar) == typeid (A)' là true chỉ khi 'someClassCVar' là kiểu A. Vì vậy, 2 phần mã của bạn không tương đương. – a1ex07
Thông thường nó là một mùi thiết kế nếu một chương trình C++ cần biết lớp con nào mà một con trỏ cha trỏ tới. Bạn nên ít nhất bước trở lại trong 15 phút và nhìn vào thiết kế của bạn. –