2010-01-19 25 views
5
class Animal 
{ 
public: 
    int a; 
    double d; 
    int f(){ return 25;} 
}; 

Giả sử mã ở trên, tôi cố gắng khởi tạo đối tượng bằng cách nói new Animal(), điều này new() cũng cấp phát bộ nhớ cho hàm f()?Có mới() cấp phát bộ nhớ cho các chức năng của một lớp không?

Nói cách khác, sự khác biệt trong điều khoản phân bổ bộ nhớ nếu tôi có lớp này thay thế và đã thực hiện new Animal() là gì?:

class Animal 
{ 
public: 
    int a; 
    double d; 
}; 

Trả lời

3

No. Chức năng tồn tại trong trang văn bản và do đó không có khoảng trống được phân bổ cho chúng.

+0

vì vậy, nếu chức năng của tôi là một chức năng ảo (lớp của tôi là trừu tượng), sẽ 'mới()' có bất kỳ vấn đề phân bổ không gian trên heap? – Moeb

+0

Tất cả chức năng ảo có nghĩa là chức năng được thêm vào vtable nằm trong bộ nhớ tĩnh. Chỉ có một bản sao của một vtable cho mỗi lớp sử dụng các chức năng ảo. –

+0

@Ignacio Tôi đang tìm câu trả lời cho: http://stackoverflow.com/questions/2091426/why-cant-we-create-objects-for-an-abstract-class-in-c Tôi nghĩ rằng vấn đề là một cái gì đó liên quan đến phân bổ bộ nhớ, nhưng tôi không thể tìm ra nó. – Moeb

7

Đối với một lớp không có chức năng ảo, bản thân chức năng sẽ mất không gian dữ liệu. Các hàm là các phần của mã có thể được thực hiện để thao tác dữ liệu. Đó là các thành viên dữ liệu phải được phân bổ.

Khi bạn có một lớp ảo, thường có một con trỏ bổ sung cho bảng ảo. Lưu ý rằng vtable là một chi tiết cụ thể triển khai. Mặc dù hầu hết các trình biên dịch sử dụng chúng, bạn không thể dựa vào nó luôn ở đó.

Tôi đã expanded về câu trả lời này cho câu hỏi khác của bạn.

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