Nội dung bài viết
Đăng ký học lập trình C++
Tại STDIO bạn được dạy nền tảng lập trình tốt nhất.
Đăng ký học
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.

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.

Tiền đề bài viết

Do nhận thấy có rất nhiều sơ sót trong vấn đề lập trình khi làm việc với override và hiện tại ngôn ngữ C++11 có hỗ trợ việc kiểm soát này, nên tôi viết bài này để chia sẻ thêm kinh nghiệm lẫn kiến thức của mình cho các bạn.

Đối tượng hướng đến

Các lập trình viên đã nắm bắt được các kiến thức căn bản của lập trình hướng đối tượng, cụ thể hơn là trong ngôn ngữ C++ (C++03).

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 "tạo ra một hàm mới" hay gọi là overload thay vì override.

THẢO LUẬN
ĐÓNG