2011-01-29 39 views
5

Giả sử rằng tôi có một số lớp như ví dụ này.Đối tượng có bộ nhớ thừa kế

class A { 
    int k, m; 
public: 
    A(int a, int b) { 
      k = a; 
      m = b; 
    } 
}; 

class B { 
    int k, m; 
public: 
    B() { 
      k = 2; 
      m = 3; 
    } 
}; 

class C : private A, private B { 
    int k, m; 
public: 
    C(int a, int b) : A(a, b) { 
      k = b; 
      m = a; 
    } 
}; 

Bây giờ, trong một đối tượng lớp C, là các biến được lưu trữ theo một cách cụ thể? Tôi biết điều gì xảy ra trong một đối tượng POD, nhưng đây không phải là đối tượng POD ...

Trả lời

2

Trong sự ra đời của Chương 10, các lớp học có nguồn gốc, cáC++ Chuẩn C đề cập đến:

Thứ tự mà các subobjects lớp cơ sở được phân bổ trong đối tượng có nguồn gốc nhất (1,8) là không xác định.

Vì vậy, trong ví dụ của bạn C đối tượng từng có một subobject lớp cơ sở của loại A và subobject lớp cơ sở của loại B, nhưng liệu các thành viên A cơ sở đến trước hoặc sau khi thành viên B cơ bản là không xác định.

0

Mặc dù tôi không chắc là nó có được yêu cầu theo tiêu chuẩn hay không, trong bất kỳ thực hiện hợp lý nào, tôi biết rằng chúng được lưu trữ trong thứ tự: A :: k, A :: m, B :: k, B :: m, C :: k, C :: m (có thể căn chỉnh theo yêu cầu của phần cứng). Lý do thực tế duy nhất trong kiến ​​thức này tôi có thể nghĩ là bạn cần hiểu rằng nếu bạn đưa con trỏ tới C tới con trỏ đến B, thì giá trị của nó (địa chỉ) sẽ khác nhau, vì vậy bạn nên cẩn thận về điều đó phôi (không sử dụng reinterpret_cast <> cho ví dụ này).

+0

Điều này có thể đúng đối với nhiều triển khai, nhưng tôi không nghĩ có bất kỳ sự đảm bảo nào. –

+0

@jdv, đúng, nó có lẽ là thực hiện cụ thể, nhưng tôi không thể nghĩ ra bất kỳ cách nào khác nó có thể được thực hiện. Tuy nhiên, nên thêm ghi chú vào câu trả lời. –

Các vấn đề liên quan