class B : public A { };
A* p1 = new B; // B may be larger than A :OK [Line 1]
B* p2 = new A; // B may be larger than A :Not OK [Line 2]
Tôi không hiểu những gì tác giả có nghĩa là bằng cách bình luận ở Line 1 và Line 2.
Tại sao không chúng ta có thể làm gì trong Dòng 2?
class B
có nguồn gốc từ class A
, trong đó - từ quan điểm của các biến thành viên nó chứa - có nghĩa là nó có mọi thứ A có và bất cứ điều gì nó chọn để thêm chính nó. Trong mã đơn giản của bạn, B đã không thêm bất cứ điều gì, nhưng nếu nó đã có các thành viên dữ liệu bổ sung, nó rõ ràng sẽ yêu cầu bộ nhớ nhiều hơn để lưu trữ hơn loại A
đơn giản hơn. Nếu nó thêm một hàm thành viên ảo trong đó A không có, trình biên dịch có thể được dự kiến sẽ thêm một con trỏ trong B ghi lại địa chỉ của bảng công văn ảo liệt kê các địa chỉ của các hàm thành viên virtual
của nó. Trình biên dịch cũng miễn phí để thêm đệm nếu nó cảm thấy thích nó.
Do đó, trường hợp chung là kích thước của một lớp dẫn xuất là >=
kích thước của lớp cơ sở của nó.
A* p1 = new B; // B may be larger than A :OK [Line 1]
Ở đây, tuy nhiên nhiều không gian B
thực sự cần được phân bổ từ đống/miễn phí cửa hàng, và địa chỉ của bộ nhớ lưu trữ trong p1
. Nếu B
lớn hơn A
, nó không có sự khác biệt - đó là một nơi khác anyway - điều quan trọng là một B*
được đảm bảo để có thể được lưu trữ trong một A*
.
B* p2 = new A; // B may be larger than A :Not OK [Line 2]
Ở đây, một mới A
đang được tạo trên heap, nhưng các lập trình viên đang cố gắng để nói với trình biên dịch rằng có một B
tại địa chỉ đó. Trình biên dịch sẽ không tin nó (trừ khi bị ép buộc) - bạn sẽ đơn giản gặp lỗi thời gian biên dịch. Nếu bạn làm thế buộc các trình biên dịch (ví dụ p2 = (B *) (mới A) ) to treat the memory address in
p2 as if it were an
B , then it may later try to access additional data it expects to be part of any
B which simply doesn't exist in any
A`: thêm các thành viên dữ liệu, con trỏ văn ảo vv ..
Nguồn
2011-07-07 09:37:26
Thực tế, tôi nghĩ rằng 'A' có thể lớn hơn' B', do tối ưu hóa lớp cơ sở trống và một số bố cục ABI lạ. –