Danh sách bài viết về C++11
Nhắc lại override
Override là việc viết lại 1 phương thức (method) trong lớp dẫn xuất (derived class) mà ở lớp cơ sở (base class).
class CReptile { public: char* getClassName(int sign) { if (sign > 0) { return "CReptile"; } } }; class CSnake: public CReptile { public: char* getClassName(int sign) { if (sign > 0) { return "CSnake"; } } };
Ở codes trên, phương thức getClassName()
trong class CSnake
override phương thức getClassName()
trong class CReptile
và getClassName()
trong class CSnake
override phương thức getClassName()
trong class CAnimal
.
Rủi ro của codes trên
class CReptile { public: char* getClassName(int sign) { if (sign > 0) { return "CReptile"; } } }; class CSnake: public CReptile { public: char* getClassName(char sign) { if (sign > 0) { return "CSnake"; } } };
Đối số trong phương thức getClassName
trong class CReptile
mang kiểu int
, do sơ suất ta có thể làm cho đối số trong getClassName
trong class CSnake
mang kiểu char
. Và mục đích ban đầu ta override hàm getClassName
đã thất bại, đây được xem như 1 hàm mới.
Từ khóa override trong C++11
Trong phiên bản C++11 có hỗ trợ thêm 1 từ khóa là override
, ý nghĩa của từ khóa này sẽ giúp kiểm soát việc 1 hàm có thật sự là override 1 phương thức của lớp mà nó đang kế thừa hay không, nếu không tồn tại phương thức mà nó đang "nghĩ" rằng nó đang override tại lớp mà nó kế thừa thì trình biên dịch sẽ báo lỗi khi biên dịch. Thêm từ khóa override
vào cuối tên phương thức như sau dòng 16.
class CReptile { public: char* getClassName(int sign) { if (sign > 0) { return "CReptile"; } } }; class CSnake: public CReptile { public: char* getClassName(char sign) override { if (sign > 0) { return "CSnake"; } } };
Do phương thức getClassName(char sign)
không có tồn tại trên lớp cơ sở, nên khi biên dịch sẽ lỗi. Từ đó, có thể biết rằng đang overload thay vì override.