Bài viết là tài liệu tham khảo cho khóa đào tạo lập trình C/C++ của STDIO Training.
Tìm hiểu và đăng ký học tại đây.
La Kiến Vinh Hướng dẫn, ý nghĩa, cách sử dụng và ứng dụng từ khóa override trong C++11. Ở C++11, các thiết kế đưa ra thêm khái niệm về override để giúp lập trình viên kiểm soát các sơ sót trong override, đôi lúc trong chương trình ta nhầm lẫn với overload.
Nội dung bài viết

Giới thiệu

Giao cho máy móc giúp con người kiểm tra chặt chẽ để giảm rủi ro cho phần mềm là một ý tưởng hay, vì máy móc sẽ luôn làm theo nguyên tắc mà nó được con người định ra. Ở C++11, cũng đưa ra thêm khái niệm về override để giúp lập trình viên kiểm soát các sơ sót trong override.

Danh sách bài viết về C++11

Nhắc lại override

Override là việc viết lại một 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ư một hàm mới.

Từ khóa override trong C++11

Trong phiên bản C++11 có hỗ trợ thêm một từ khóa là override, ý nghĩa của từ khóa này sẽ giúp ta kiểm soát việc một hàm có thật sự là override một 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. Ta 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ừ đó, ta có thể biết rằng, ta đang overload thay vì override.

THẢO LUẬN
ĐÓNG