Tại sao # 1 không phải là tổng hợp?
Bởi vì định nghĩa chuẩn của tập hợp nói rằng nó không phải là. Định nghĩa nói rằng lớp không thể có các hàm ảo nếu nó được coi là một loại tổng hợp. Đó là nó. Đó là câu trả lời "đội trưởng rõ ràng".
Vì bạn trích dẫn định nghĩa chuẩn (và đọc nó, tôi đoán), bạn biết điều này rồi, vì vậy tôi phải giả định rằng những gì bạn đang hỏi là có lý do cơ bản nào không. kiểu.
Rõ ràng, một lớp có chức năng ảo phải có con trỏ bảng ảo (hoặc cơ chế khác) được khởi tạo như một phần của hàm tạo được trình biên dịch tạo ra. Và điều duy nhất mà cốt liệu thực sự cung cấp (ngoài việc phục vụ như là một định nghĩa cơ sở cho POD và những thứ tương tự) là khả năng thực hiện khởi tạo xoăn của các thành viên dữ liệu của nó. Tôi không thấy bất kỳ lý do tại sao trình biên dịch có thể không chỉ đơn giản cho phép cú pháp khởi tạo xoăn xoắn trong khi thực hiện khởi tạo con trỏ bảng ảo quá.
Có liên quan, nó có thể là tổng hợp vì khởi tạo cú đúp có thể miễn là có cách để xây dựng các thành viên dữ liệu từ bất kỳ thứ gì được cung cấp (hoặc không được cung cấp) trong danh sách khởi tạo, tức là , nó cần mỗi thành viên dữ liệu để có một số (mặc định biên dịch tạo ra hay không) mặc định, sao chép hoặc di chuyển constructor. Hãy nhớ rằng, định nghĩa của tổng hợp là nông ngược với đệ quy như định nghĩa POD (tầm thường, bố cục std), có nghĩa là chỉ có lớp cấp cao nhất có những hạn chế đó chứ không phải các đối tượng phụ của nó.
Định nghĩa cốt liệu rõ ràng là rất gợi nhớ về các hạn chế cấu trúc C, và khởi tạo cú đúp cho cấu trúc rõ ràng cũng là một tính năng được chuyển từ C. Tôi tin rằng vì lý do lịch sử, định nghĩa của tập hợp được xây dựng sao cho nó phản ánh cấu trúc C, chứ không phải vì lý do gì hoặc không thể cho trình biên dịch thực hiện.
Tôi chắc chắn sẽ có ý kiến rằng không có lý do chính đáng nào cho việc hạn chế tổng hợp không có chức năng ảo. Có lẽ một đề nghị nên được thực hiện cho ủy ban tiêu chuẩn để loại bỏ hạn chế này (vì nó sẽ không phá vỡ bất kỳ mã hiện có nào). Đặc biệt bây giờ, với cú pháp khởi tạo thống nhất, tổng hợp không có gì khác ngoài các lớp mà trình biên dịch có thể tạo ra một hàm tạo với tất cả các thành viên dữ liệu làm tham số (với các giá trị mặc định là các đối tượng được xây dựng mặc định). Mục đích duy nhất cho cốt liệu là gộp một vài hạn chế áp dụng cho các lớp POD (tầm thường, bố cục chuẩn, v.v.), mà hạn chế không có chức năng ảo là hợp lý (AFAIK), nhưng đó chỉ là vấn đề chuyển giới hạn đó sang POD.
"[..] và không có chức năng ảo (10.3)"? – MrDuk
Trích dẫn của bạn "không có chức năng ảo" cho chúng tôi biết rằng đó là tổng hợp. – harper
@MrDuk Có, tôi có thể xác minh rằng đây là phần cuối cùng của văn bản mà tôi đã trích dẫn. Hay bạn muốn hỏi một câu hỏi khác? –