Tôi có một sự nhầm lẫn về việc thừa kế thuộc tính ảo của một phương thức. Giả sử chúng ta có 4 lớp: lớp A, lớp B, lớp C và lớp D. Các lớp được kế thừa theo cách này: A -> B -> C -> D, trong đó A là lớp cơ sở. Vào lúc này, tôi chắc chắn về điều này: Bắt đầu khai báo phương thức lớp với virtual trong lớp cơ sở (class A), làm cho phương thức ảo cho tất cả các lớp bắt nguồn từ lớp cơ sở, bao gồm cả các lớp dẫn xuất của lớp các lớp dẫn xuất. (Các phương thức lớp B và C được xác định là ảo).Thừa kế chức năng ảo
Sự nhầm lẫn ở đây. Điều gì xảy ra nếu, trong lớp cơ sở A, sẽ không có bất kỳ thành viên ảo nào. Thay vào đó, hãy nói rằng lớp B tuyên bố một phương thức là ảo. Tôi cho rằng, sự thay đổi này sẽ làm cho hàm ảo cho tất cả các lớp dẫn xuất thuộc về chuỗi kế thừa (các lớp C và D). Vì vậy, hợp lý, B cho C và D, là một loại "lớp cơ sở" của họ, phải không? Hoặc là tôi sai?
gợi ý nhanh: nếu lớp cơ sở có một phương thức ảo, nên tôi làm nổi bật phần còn lại của phương pháp ảo thuộc về các lớp được thừa với từ khóa ảo? Chỉ để thể hiện rõ hơn. –
Không phải là không cần thiết. Làm điều đó một lần trong lớp cơ sở cung cấp cho tất cả các lớp con khả năng thay đổi việc thực hiện hàm (tất cả được thừa kế). – theta
@RobertEagle Thêm 'virtual' hoặc' override' vào các lớp dẫn xuất là không cần thiết *, nhưng tôi sẽ nói _yes_, đó là một cách hay để đặt lời nhắc trực quan về ngữ nghĩa của hàm bất cứ khi nào có thể. * trừ khi sử dụng một trình biên dịch như 'g ++' cung cấp cảnh báo nếu các vòng loại này bị thiếu, và bạn nói để xử lý cảnh báo là lỗi. –