Máy móc cho cuộc gọi ảo (thường là một bảng v, nhưng không cần phải) được thiết lập trong khi ctor-initializer, sau khi xây dựng các subobject cơ sở và trước khi xây dựng các thành viên. Mục [class.base.init]
nghị định:
Chức năng thành viên (bao gồm chức năng thành viên ảo, 10.3) có thể được gọi cho đối tượng đang được xây dựng. Tương tự, đối tượng đang được xây dựng có thể là toán hạng của toán tử typeid
(5.2.8) hoặc của một số dynamic_cast
(5.2.7). Tuy nhiên, nếu các hoạt động này được thực hiện bằng ctor-initializer (hoặc trong một chức năng được gọi trực tiếp hoặc gián tiếp từ ctor-initializer) trước khi tất cả bộ khởi tạo mem cho các lớp cơ sở đã hoàn thành, kết quả của hoạt động không định nghĩa được.
Thực ra, trong khi xây dựng các lớp con cơ sở, máy móc chức năng ảo tồn tại nhưng được thiết lập cho lớp cơ sở. Phần [class.cdtor
] nói:
Chức năng của thành viên, bao gồm chức năng ảo (10.3), có thể được gọi trong khi xây dựng hoặc phá hủy (12.6.2). Khi một hàm ảo được gọi trực tiếp hoặc gián tiếp từ một hàm tạo hoặc từ một destructor, bao gồm trong quá trình xây dựng hoặc hủy các thành phần dữ liệu không tĩnh của lớp và đối tượng mà cuộc gọi được áp dụng là đối tượng (gọi nó là x
) hoặc sự hủy diệt, hàm được gọi là người ghi đè cuối cùng trong lớp của hàm tạo hoặc hàm hủy và không phải là một hàm ghi đè nó trong một lớp có nguồn gốc cao hơn. Nếu cuộc gọi hàm ảo sử dụng truy cập thành viên lớp rõ ràng (5.2.5) và biểu thức đối tượng đề cập đến đối tượng hoàn chỉnh của x
hoặc một trong các lớp con cơ sở của đối tượng đó nhưng không phải là x
hoặc một trong các lớp con cơ sở của nó, hành vi là không xác định .
Nguồn
2011-07-06 05:32:35
Doe Điều này có nghĩa là 'vptr' sẽ được sửa đổi mỗi khi các subobject cơ bản được xây dựng, nếu có nhiều cấp đạo hàm? – fengqi