2011-01-19 100 views
12

Tôi biết những gì ghi đè bằng C++. Tuy nhiên, có ghi số ghi đè không? Nếu vậy, nó có nghĩa là gì?C++ Ghi đè ... ghi đè?

Cảm ơn.

+0

Tôi chưa bao giờ nghe thuật ngữ "ghi đè" được sử dụng cho bất kỳ điều gì liên quan đến C++. –

+3

Nguồn gốc của cụm từ "ghi đè" có thể là một bản dịch xấu từ tiếng Đức sang tiếng Anh. Thuật ngữ kỹ thuật của Đức cho "ghi đè" là "überschreiben" theo nghĩa đen (!) Dịch ngược lại thành tiếng Anh là "ghi đè". Vậy bạn có thể nói tiếng Đức không? – nabulke

+0

@nabulke, tôi có ZD (Zertifikat Deutsh), vì vậy, ich spreche etwas Deutsch. – Simplicity

Trả lời

14

Trong thuật ngữ C++, bạn có trọng (liên quan đến phương pháp ảo trong một hệ thống phân cấp lớp) và quá tải (liên quan đến một hàm có cùng tên nhưng lấy thông số khác nhau). Bạn cũng có ẩn tên (thông qua khai báo rõ ràng cùng tên trong vùng hoặc phạm vi khai báo lồng nhau).

Tiêu chuẩn C++ không sử dụng cụm từ "ghi đè" ngoại trừ dạng tiếng Anh chuẩn của nó (nghĩa là thay thế một giá trị bằng giá trị mới, như trong bài tập x = 10 ghi đè giá trị trước đó là x).

7

Bạn có thể ghi đè các biến, ví dụ: int a = 0; a = 42; và tệp (mở một tệp hiện có để ghi - nếu bạn có quyền, nó sẽ ghi đè nội dung tệp hiện có) nếu đó là ý của bạn. Điều này có rất ít liên quan đến việc ghi đè. Bạn có nghĩ đến việc quá tải không?

5

Sự phân biệt thông thường mà tôi quen thuộc là ghi đè và quá tải. Chức năng ảo bị ghi đè. Các hàm bị quá tải khi có một phiên bản có cùng tên nhưng chữ ký khác nhau (điều này tồn tại bằng nhiều ngôn ngữ). Trong C++ bạn cũng có thể quá tải toán tử.

AFAIK, ghi đè là một khái niệm không liên quan (ghi đè một biến, tệp, bộ đệm, v.v.) và không cụ thể cho ngôn ngữ C++ hoặc thậm chí là OOP.

+2

Trên thực tế nó không chỉ _operators_ có thể được quá tải, nhưng bất kỳ chức năng. (IIRC, 'std :: sqrt()' bị quá tải – sbi

+0

@sbi: Đó là một điểm tốt. – Uri

2

Ghi đè là "điều bình thường" trong OOP: Lớp dẫn xuất cung cấp triển khai khác (nghĩa là chuyên sâu hơn) cho thứ gì đó, ghi đè lớp cơ sở, ví dụ: apple::foo() ghi đè fruit::foo() nếu táo là một lớp có nguồn gốc từ trái cây. (không bị nhầm lẫn với quá tải bằng cách sử dụng các chữ ký tham số khác nhau, dẫn đến các chức năng hoàn toàn khác biệt).

Ghi đè Tôi biết là thay thế hoàn toàn bằng định nghĩa khác. Không phải ở một mức độ cụ thể nhưng nói chung cho phần còn lại của chương trình. javascript đôi khi được sử dụng này, nếu một khuôn khổ lớn có một số vấn đề đặc biệt, và bạn không muốn xé tập tin lớn ngoài:

<script type="text/javascript" 
    src="some super big framework, often in one big file"> 
<script type="text/javascript"> 
    Ext.ux.window.createWin = function() { 
    // completely OVERWRITE the implementation 
     (often to 'hotfix' a particular bug) 
    } 
</script> 

Tuy nhiên: Tôi không biết về bất kỳ điều như vậy trong C++, như một định nghĩa lại định kỳ của một hàm sẽ luôn dẫn đến các lỗi đã có trong thời gian biên dịch. Tối đa, tôi có thể tạo hình các con trỏ hàm uốn, hoặc (lại) xác định các móc gọi lại.