Trong khoản 27 của "Effective C++" (3rd Edition, trang 118), Scott Meyers nói:Nhiều hơn 1 địa chỉ cho đối tượng lớp dẫn xuất?
class Base { ... };
class Derived: public Base { ... };
Derived d;
Base *pb = &d;
Ở đây chúng tôi chỉ tạo ra một con trỏ lớp cơ sở cho một đối tượng lớp được thừa kế, nhưng đôi khi, hai con trỏ sẽ không giống nhau. Khi đó là trường hợp, một bù đắp được áp dụng khi chạy đến con trỏ
Derived*
để có được giá trị con trỏBase*
chính xác.ví dụ cuối cùng này cho thấy rằng một đối tượng duy nhất (ví dụ, một đối tượng kiểu
Derived
) có thể có nhiều hơn một địa chỉ (ví dụ, địa chỉ của nó khi được trỏ đến bởi một con trỏBase*
và địa chỉ của nó khi được trỏ đến bởi một con trỏDerived*
) .
Dưới đây là một chút khó hiểu. Tôi biết rằng một con trỏ đến lớp cơ sở có thể trỏ đến một đối tượng của lớp dẫn xuất trong thời gian chạy, điều này được gọi là đa hình hoặc ràng buộc động. Nhưng đối tượng lớp dẫn xuất có thực sự có nhiều hơn 1 địa chỉ trong bộ nhớ không?
Đoán tôi có một số hiểu lầm ở đây. Ai đó có thể cho một số làm rõ? Có lẽ điều này có liên quan đến sự đa hình được thực hiện trong trình biên dịch C++ như thế nào?
"với kế thừa đơn thường là" - bạn có thể nghĩ ra bất kỳ trường hợp nào mà nó * sẽ không *? – us2012
@ us2012: Lớp cơ sở không đa hình, lớp dẫn xuất đa hình, con trỏ vtable được thêm tại offset 0 trong lớp dẫn xuất, tiếp theo là lớp cơ sở. – MSalters
@MSalters Đẹp! Cảm ơn. – us2012