2014-06-13 13 views
14

Khi tôi ghi đè lên một hàm ảo:Tôi có nên chỉ định 'ảo' một lần nữa khi tôi ghi đè hàm C++ không?

class Geoff 
{ 
public: 
    virtual int getArea() { return 0; } 
} 

Tôi có nên chỉ định 'ảo' một lần nữa khi tôi ghi đè lên nó? Liệu nó có bất kỳ sự khác biệt? Tôi biết cả hai cách dường như hoạt động tốt, chỉ cần tự hỏi nếu có nhiều hơn nó.

class George : public Geoff 
{ 
public: 
    virtual int getArea() { return x*y; } 
} 
+0

Nó không phải là một bản dupe, nhưng nó chắc chắn liên quan. –

+0

@ 一 二三: đó là một ứng cử viên nghèo cho một bản sao, vì nó thực sự hỏi nếu bạn bằng cách nào đó có thể "thay thế" một chức năng *** mà không sử dụng từ khóa ảo (câu trả lời tốt giải thích sự khác biệt giữa ẩn và công văn ảo) . –

+1

@TonyD - đó là một cuộc đua bạn thấy, là người đầu tiên xé câu hỏi bằng cách chỉnh sửa nó thành một cái gì đó nó không, hoặc có câu hỏi tắt hoàn toàn. ;-P –

Trả lời

26

Nếu bạn sử dụng C++ 11, bạn nên sử dụng override thay vào đó, mà cả hai tài liệu mà bạn đang trọng một hàm ảo và kiểm tra rằng một hàm ảo phù hợp với tồn tại trong một cơ sở cho trọng.

int getArea() override { return x*y; } 

Trong C++ 03 đó là lựa chọn phong cách - đặt virtual nếu bạn cảm thấy nó thêm giá trị tài liệu.

+2

Bạn cũng có thể sử dụng 'final' để ngăn chặn các ghi đè khác, và điều đó cho phép trình biên dịch dễ dàng hơn trong việc thực hiện các cuộc gọi đến hàm thành viên đó. –

+1

Tôi nghĩ rằng nếu bạn biết rằng GEORGE sẽ được mở rộng, sau đó đặt ảo với nó. Vì mục đích hiểu biết. –

+1

@ Al-mo Tôi xin lỗi, nhưng đó là lời khuyên xấu. "Ghi đè" là quá rõ ràng, đủ để cho thấy rằng phương thức này là ảo. –

7

Không, sử dụng ghi đè. (http://en.cppreference.com/w/cpp/language/override)

Nó có lợi thế là không thành công nếu phương thức không ảo trong bố mẹ.

chỉnh sửa

Như Mark chỉ ra, nó cũng thất bại nếu chữ ký không phù hợp, trong khi ảo sẽ âm thầm "thành công". Các báo giá sợ hãi là bởi vì một chữ ký không khớp sẽ ẩn các phương pháp bóng tối trong cơ sở và thực hiện một phương pháp ảo mới đó là không liên quan.

+1

Và nó cũng kiểm tra nếu phương pháp ghi đè có chữ ký tương thích với phương thức bị ghi đè (rằng nó thực sự ghi đè phương thức, có). –

+0

@MarkGarcia Đó là sự thật, và là một điểm tốt, bởi vì bạn sẽ không muốn vô tình quá tải khi cố gắng ghi đè lên. –

+0

Cảm ơn, ghi đè vẫn tạo ra một cảnh báo cho tôi trong VS2010 vì vậy tôi sẽ phải xem xét một trong đó với các kiến ​​trúc sư của chúng tôi. –

Các vấn đề liên quan