Trong C++ dữ liệu cũ thuần túy (POD) không có thông tin loại thời gian chạy. Các lớp được mô tả tất cả lấy chính xác 1 byte và có các biểu diễn thời gian chạy giống hệt nhau trong bất kỳ trình biên dịch nào với tối ưu hóa lớp cơ sở trống.
Như những gì bạn muốn không thể thực hiện được.
Thêm trình phá hủy ảo vào lớp cơ sở bổ sung trong RTTI và hỗ trợ dynamic_cast
.
Thêm trường enum
hoặc int
vào cơ sở được khởi tạo khác nhau cho mỗi lớp dẫn xuất cũng hoạt động.
Tuy nhiên, tùy chọn khác là để tạo một hàm mẫu, và lưu trữ một con trỏ đến nó, như vậy:
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
và sau đó lưu trữ một my_type_id
trong A
khởi tạo một cách thích hợp. Điều này là tái phát minh RTTI, và khi bạn muốn nhiều tính năng hơn, bạn sẽ tiếp cận C++ RTTI overhead.
Trong C++ bạn chỉ trả tiền cho những gì bạn yêu cầu: bạn có thể yêu cầu các lớp học không có RTTI, bạn đã làm và nhận được nó.
RTTI là thông tin loại thời gian chạy. POD là dữ liệu cũ thuần túy, một thuật ngữ C++ 03. Nhiều lớp không phải là POD: cách dễ dàng là thêm một destructor virtual
. C++ 11 có bố cục chuẩn và các thuật ngữ tổng hợp tốt hơn.
RTTI và POD về mặt kỹ thuật không đối lập nhau: có các lớp không có RTTI không phải là POD.Lưu ý rằng MSVC có các tùy chọn để không tạo RTTI và gấp Comdat tích cực của nó có thể phá vỡ RTTI thủ công tôi đã làm ở trên, trong cả hai trường hợp vi phạm tiêu chuẩn.
Bạn có yêu cầu 'dynamic_cast <>' không? Đó không phải là C++ 11 cụ thể. –
Không có gì thay đổi: không có sự phản ánh trong tiêu chuẩn C++. Nếu bạn muốn bật thông tin loại thời gian chạy, bạn 'dynamic_cast' – quantdev
Có thể quan tâm: http://stackoverflow.com/q/25495733/596781 –