2013-02-06 31 views
5

Hãy xem xét các đoạn mã sau:C++: ảo Inheritance

#... 
class A {}; 
class B: public A{}; 
class C: virtual public A{}; 
class D: virtual public C{}; 
// No More Classes 
... 
int _tmain(int argc, _TCHAR* argv[]) { 
cout<<sizeof(A)<<" "; 
cout<<sizeof(B)<<" "; 
cout<<sizeof(C)<<" "; 
cout<<sizeof(D)<<"."; 

... 
} 

O/P: 1 1 4 8.

Câu hỏi:

  1. sizeof (A) = 1byte, và vị trí này giữ những gì đáng kể cho trình biên dịch/chúng tôi.
  2. Tại sao trình biên dịch bận tâm thêm vptr vào đối tượng lớp C khi không có gì thực sự nằm.
  3. Nếu chúng tôi không có bất kỳ chức năng ảo nào, trình biên dịch sẽ thêm một vptr thừa vào các đối tượng có nguồn gốc.

*. 'Câu hỏi đầu tiên của tôi ở đây, xin vui lòng sửa tôi nếu bạn tìm thấy bất cứ điều gì sai trái.

+0

Đối với câu hỏi đầu tiên ở đây: +1 cho bài đăng tốt, được định dạng tốt và tự giải thích. –

+2

Tôi không thực sự thấy bất kỳ câu hỏi nào, chỉ là một danh sách các câu lệnh. –

+0

@JoachimPileborg - "2. Tại sao trình biên dịch bận tâm để thêm vptr trong đối tượng lớp C khi không có gì thực sự cư trú". Tôi đoán '3.' giống như' .2'. Và '1.' rất có thể - cho thấy OP biết tại sao kết quả là' 1'. –

Trả lời

8

Tóm lại không phải do lớp học là ảo hay không, đó là vì tiêu chuẩn yêu cầu tất cả các đối tượng phải được phân biệt bởi địa chỉ bộ nhớ của chúng. Xem câu hỏi này:

Why is the size of an empty class in C++ not zero?

+0

bạn đánh bại tôi với nó, 1 cho câu trả lời tốt! – odinthenerd

0

quảng cáo 1. Xem PeddleSpam's answer

quảng cáo 2. IIRC trình biên dịch đưa nhiều thông tin hơn chức năng chỉ ảo trỏ vào cái gọi là VMT. Một thông tin nữa là vị trí của A ảo trong C, tôi nghĩ vậy.

quảng cáo 3. Xem 2.