Câu trả lời phụ thuộc vào phiên bản ngôn ngữ, vì điều này đã thay đổi từ C++ 03 thành C++ 11.
Trong C++ 03, quy tắc là:
thành viên trong khối điều khiển cùng truy cập (có nghĩa là, từ một trong những public
, protected
, private
từ khóa kế tiếp từ bộ đó) là được phân bổ theo thứ tự khai báo trong lớp, không nhất thiết phải liên tục.
Trong C++ 11, các quy tắc đã được thay đổi như sau:
viên với mức độ kiểm soát cùng truy cập (công cộng, bảo vệ, tư nhân) đang được phân bổ theo thứ tự khai trong lớp, không nhất thiết phải liên tục.
Vì vậy, trong C++ 03, bạn có thể đảm bảo điều này (tôi sử dụng @
để có nghĩa là bù đắp của một thành viên trong lớp):
@m_ac < @m_scp
@m_i1 < @m_i2 < @m_b1 < @m_b2
Trong C++ 11, bạn có thêm một số bảo đảm:
@m_ac < @m_scp
@m_sc < @m_i1 < @m_i2 < @m_b1 < @m_b2
@m_name < @m_b3
Trong cả hai phiên bản, trình biên dịch có thể sắp xếp lại các thành viên trong chuỗi khác nhau vì nó thấy phù hợp, và nó thậm chí có thể interleave các dây chuyền.
Lưu ý rằng có thêm một cơ chế có thể nhập vào hình ảnh: các lớp bố cục tiêu chuẩn.
Lớp là bố cục chuẩn nếu không có ảo, nếu tất cả thành viên dữ liệu không tĩnh của nó có cùng kiểm soát truy cập, nó không có lớp cơ sở hoặc thành viên dữ liệu không tĩnh của loại bố cục không chuẩn hoặc kiểu tham chiếu và nếu nó có nhiều nhất một lớp với bất kỳ thành viên dữ liệu không tĩnh nào trong chuỗi kế thừa của nó (ví dụ:nó không thể vừa định nghĩa các thành viên dữ liệu không tĩnh của nó và kế thừa một số từ một lớp cơ sở).
Nếu lớp là bố cục chuẩn, có bảo đảm bổ sung rằng địa chỉ của thành viên dữ liệu không tĩnh đầu tiên giống với địa chỉ của đối tượng lớp (điều này có nghĩa là không thể có lớp đệm ở đầu bố cục lớp). Lưu ý rằng các điều kiện về bố trí chuẩn, cùng với các trình biên dịch thực tế không đưa ra lựa chọn bi quan, có nghĩa là trong lớp bố cục chuẩn, các thành viên sẽ được sắp xếp liên tục theo thứ tự khai báo (với phần đệm cho liên kết xen kẽ khi cần thiết).
Tránh 'được bảo vệ', tránh các con trỏ trần. –
Thực tế một bản sao: http://stackoverflow.com/q/15763091/560648 Vui lòng tìm kiếm trước khi yêu cầu. –