- Vâng, họ giống nhau. Lớp dẫn xuất không khai báo một cái gì đó ảo không ngăn nó trở thành ảo. Trên thực tế, không có cách nào để ngăn bất kỳ phương thức nào (bao gồm hàm hủy) trở thành ảo trong một lớp dẫn xuất nếu nó là ảo trong một lớp cơ sở. Trong> = C ++ 11, bạn có thể sử dụng
final
để ngăn nó bị ghi đè trong các lớp dẫn xuất, nhưng điều đó không ngăn nó bị ảo.
- Có, một hàm hủy trong một lớp dẫn xuất có thể bị bỏ qua nếu nó không có gì để làm. Và nó có ảo hay không không quan trọng.
- Tôi sẽ bỏ qua nó nếu có thể. Và tôi luôn sử dụng lại
virtual
từ khóa cho các hàm ảo trong các lớp dẫn xuất vì lý do rõ ràng. Mọi người không cần phải đi lên toàn bộ hệ thống phân cấp kế thừa để tìm ra rằng một hàm là ảo. Ngoài ra, nếu lớp của bạn có thể sao chép hoặc di chuyển được mà không cần phải khai báo bản sao hoặc di chuyển các hàm tạo của riêng bạn, thì việc khai báo hàm hủy thuộc bất kỳ loại nào (ngay cả khi bạn định nghĩa nó là default
) sẽ buộc bạn phải khai báo bản sao và di chuyển các hàm tạo và toán tử gán nếu bạn muốn chúng vì trình biên dịch sẽ không đưa chúng vào cho bạn nữa.
Như một điểm nhỏ cho mục 3. Nó đã được chỉ ra trong các nhận xét rằng nếu một trình hủy không được khai báo, trình biên dịch sẽ tạo ra một giá trị mặc định (vẫn là ảo). Và mặc định đó là một hàm nội tuyến.
Các hàm nội tuyến có khả năng khiến chương trình của bạn tiếp xúc với các thay đổi trong các phần khác của chương trình và làm cho khả năng tương thích nhị phân đối với các thư viện dùng chung trở nên khó khăn. Ngoài ra, việc gia tăng khớp nối có thể dẫn đến việc biên dịch lại nhiều khi đối mặt với một số loại thay đổi. Ví dụ: nếu bạn quyết định rằng bạn thực sự muốn triển khai cho trình hủy ảo của mình thì mọi đoạn mã gọi nó sẽ cần được biên dịch lại. Trong khi nếu bạn đã khai báo nó trong phần thân lớp và sau đó xác định nó trống trong một .cpp
tệp, bạn sẽ ổn khi thay đổi nó mà không cần biên dịch lại.
Lựa chọn cá nhân của tôi vẫn là bỏ qua nó khi có thể. Theo ý kiến của tôi, nó làm lộn xộn mã và trình biên dịch đôi khi có thể làm những việc hiệu quả hơn một chút với việc triển khai mặc định trên một bản trống. Nhưng có những ràng buộc mà bạn có thể gặp phải khiến đó là một lựa chọn tồi.