Video: Kĩ năng search google dành cho dân IT 2025
Trong C ++, chỉ vì bạn nghĩ rằng một cuộc gọi chức năng cụ thể bị ràng buộc trễ không có nghĩa là nó là. Nếu không được tuyên bố với cùng một đối số trong các lớp con, thì các hàm thành viên không được ghi đè theo hình thức, cho dù chúng có được khai báo ảo hay không.
Một trường hợp ngoại lệ đối với quy tắc khai báo giống nhau là nếu hàm thành viên trong lớp cơ sở trả về một con trỏ hoặc tham chiếu đến một đối tượng lớp cơ sở, một đối tượng ghi đè trong một lớp con có thể trả lại một con trỏ hoặc tham chiếu tới một đối tượng của phân lớp con. Nói cách khác, hàm makeACopy () là đa hình, mặc dù kiểu trả về của hai chức năng khác nhau:
class Base {public: // trả lại bản sao của đối tượng hiện tại Base * makeACopy ();}; class SubClass: public Base {public: // trả lại một bản sao của đối tượng hiện tại SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopy = bc. makeACopy (); / / tiếp tục …}
Trong thực tế, điều này là khá tự nhiên. Một makeACopy () sẽ trả về một đối tượng kiểu SubClass , mặc dù nó có thể ghi đè BaseClass:: makeACopy () .
Việc kinh doanh này quyết định âm thầm khi nào một chức năng bị ghi đè và khi không phải là một lỗi nguồn trong C ++; quá nhiều để tiêu chuẩn năm 2011 giới thiệu mô tả ghi đè mà lập trình viên có thể sử dụng để chỉ ra ý định của mình để ghi đè lên một chức năng lớp cơ sở.
C ++ tạo ra một lỗi biên dịch nếu một hàm được khai báo ghi đè, nhưng trên thực tế thì không ghi đè một hàm lớp cơ sở vì một số lý do (như đối số không khớp) như trong ví dụ sau: >
class Student {public: virtual void addCourseGrade (cấp hai);}; lớp GradStudent: sinh viên công cộng {public: virtual void addCourseGrade (float grade) override;};Đoạn mã này tạo ra lỗi biên dịch vì phương thức GradStudent:: addCourseGrade (float) đã được khai báo ghi đè nhưng nó không ghi đè lên chức năng lớp cơ sở Student:: addCourseGrade (double) vì các kiểu đối số don ' phù hợp.
cuối cùng
ngay cả khi chức năng đó tự ghi đè lên một số hàm cơ sở trước đó, như được trình bày trong > Lớp PostDoc : lớp GradStudent: sinh viên công cộng {public: virtual void addCourseGrade (cấp đôi) cuối cùng;}; class PostDoc: public GradStudent {public: ảo void addCourseGrade (cấp đôi);}; Kể từ Student:: addCourseGrade () được đánh dấu là cuối cùng ,
tuyên bố PostDoc:: addCourseGrade () gây ra lỗi vì nó cố gắng ghi đè lên phương pháp
Student . Điều này ảnh hưởng không chỉ là các phương pháp ảo của lớp. Một lớp
cuối cùng không thể được kế thừa từ tất cả.