Có hai cách để bạn có thể thực hiện việc này. Đầu tiên, bạn có thể sử dụng toán tử typeid
, trả về cấu trúc type_info
chứa thông tin về loại đối tượng. Ví dụ:
Base* ptr = /* ... */
if (typeid(*ptr) == typeid(DerivedType)) {
/* ... ptr points to a DerivedType ... */
}
Lưu ý rằng bạn phải sử dụng typeid(*ptr)
và không phải typeid(ptr)
tại đây. Nếu bạn sử dụng typeid(ptr)
, thì bạn sẽ lấy lại đối tượng type_info
cho Base*
, vì con trỏ có loại Base*
bất kể nó trỏ đến điểm gì.
Một điểm quan trọng cần lưu ý là điều này sẽ kiểm tra xem những gì ptr
điểm là chính xác là DerivedType
. Nếu ptr
chỉ vào một đối tượng thuộc loại có nguồn gốc từ DerivedType
(có thể là EvenMoreDerivedType
), mã này sẽ không hoạt động chính xác.
Một cách khác để kiểm tra xem bạn đang chỉ vào một đối tượng thuộc loại nào đó mạnh hơn một chút là sử dụng toán tử dynamic_cast
. dynamic_cast
thực hiện một kiểu chữ được kiểm tra ở thời gian chạy sẽ mang lại một con trỏ hợp lệ nếu diễn viên thành công và NULL nếu không. Ví dụ:
Base* ptr = /* ... */;
DerivedType* derived = dynamic_cast<DerivedType*>(ptr);
if (derived) {
/* ... points to a DerivedType ... */
}
này có lợi thế thêm rằng nếu ptr
điểm tại một cái gì đó giống như một EvenMoreDerivedType
, các diễn viên sẽ vẫn thành công vì EvenMoreDerivedType
thừa hưởng từ DerivedType
.
Như một ý nghĩ cuối cùng, bạn đôi khi thấy mã như thế này:
Base* ptr = /* ... */
if (DerivedType* derived = dynamic_cast<DerivedType*>(ptr)) {
/* ... points to a DerivedType ... */
}
này tại địa phương phạm vi con trỏ derived
cho cơ thể của báo cáo kết quả if
và sử dụng thực tế là các giá trị khác không đánh giá để true
trong C++. Cá nhân tôi thấy điều này dễ đọc hơn và ít bị lỗi hơn, nhưng bằng mọi cách đi với những gì dễ dàng nhất cho bạn.
Hy vọng điều này sẽ hữu ích!
Loại 'childObject' là gì? Không có cách chung để làm điều này trong C++ bởi vì, khi chạy, khái niệm về kiểu không tồn tại. –
Ok, tôi sẽ chỉnh sửa câu hỏi – Homam
Mặc dù bạn không nói gì về childObject.GetType(), tuy nhiên mã này là khủng khiếp, bởi vì nó chi nhánh trên so sánh kiểu. Đó là những gì OOP được cho là để loại bỏ. –