this
cung cấp địa chỉ của đối tượng, không nhất thiết phải là địa chỉ của thành viên đầu tiên. Ngoại lệ duy nhất được gọi là bố cục tiêu chuẩn loại. Từ tiêu chuẩn C++ 11:
(9.2/20) Con trỏ đến đối tượng cấu trúc bố cục chuẩn, được chuyển đổi phù hợp sử dụng reinterpret_cast
, trỏ đến thành viên ban đầu của nó (hoặc nếu thành viên đó là một trường bit , sau đó đến đơn vị nơi nó cư trú) và ngược lại. [Lưu ý: Do đó có thể có đệm không tên trong một đối tượng cấu trúc bố trí chuẩn, nhưng không phải ở đầu của nó, khi cần thiết để đạt được sự liên kết phù hợp.- cuối note]
Đây là định nghĩa của một loại tiêu chuẩn bố trí:
(9/7) Một lớp học tiêu chuẩn bố trí là một lớp rằng:
- không có người không tĩnh thành viên dữ liệu thuộc loại không bố cục tiêu chuẩn loại hoặc tham chiếu,
- không có chức năng ảo (10.3) và không có lớp cơ sở ảo (10.1),
- có cùng quyền kiểm soát truy cập (khoản 11) cho tất cả các thành viên dữ liệu không tĩnh,
- không có tiêu chuẩn-la các lớp cơ sở yout,
- hoặc không có thành viên dữ liệu không tĩnh trong lớp có nguồn gốc nhiều nhất và ít nhất một lớp cơ sở với thành viên dữ liệu không tĩnh hoặc không có lớp cơ sở với thành viên dữ liệu không tĩnh và
- không có các lớp cơ sở cùng loại với thành viên dữ liệu không tĩnh đầu tiên. [108]
[108] Điều này đảm bảo rằng hai subobjects có kiểu lớp giống nhau và thuộc về các đối tượng có nguồn gốc nhất cùng không được phân bổ tại cùng một địa chỉ (5.10).
Lưu ý rằng loại đối tượng không phải là POD – có bố cục chuẩn như được xác định ở trên là đủ. (POD tất cả đều có bố cục chuẩn, nhưng ngoài ra, chúng là trivially constructible, có thể di chuyển một cách trivially và có thể sao chép được.)
Theo như tôi có thể nói từ mã của bạn, kiểu của bạn có vẻ là bố cục chuẩn (đảm bảo kiểm soát truy cập là như nhau cho tất cả các thành viên dữ liệu không tĩnh). Trong trường hợp này, this
thực sự sẽ trỏ đến thành viên ban đầu. Về việc sử dụng mục đích này cho mục đích tuần tự hóa, tiêu chuẩn thực sự nói rõ ràng:
(9/9) [Lưu ý: Các lớp bố cục chuẩn hữu ích khi giao tiếp với mã được viết bằng các ngôn ngữ lập trình khác. Bố trí của chúng được xác định trong 9.2. - lưu ý cuối cùng]
Tất nhiên điều này không giải quyết được các vấn đề về tuần tự hóa. Cụ thể, bạn sẽ không nhận được tính di động của dữ liệu được tuần tự hóa (ví dụ: do tính không tương thích của endianness).
Tại sao bạn không thử? Xuất bản a và b, thêm một phương thức ảo và sau đó kiểm tra địa chỉ của A :: a. – Spook
@Spook Tôi đoán anh ấy đã thử trên một lớp POD, và nó đã làm việc :) –
@Spook Tôi nghĩ anh ấy muốn biết tiêu chuẩn ISO nói gì. Ít nhất thì tôi cũng vậy. –