2012-11-04 35 views
44

Có cách nào để thực thi việc sử dụng từ khóa C++ 11 override trong Visual C++ 2012 không?Làm cách nào để thực thi từ khóa 'ghi đè'?

(ví dụ: nếu tôi quên nói override, sau đó tôi muốn có được một cảnh báo/báo lỗi.)

+3

@HansPassant: Visual C++? – Mehrdad

+10

Tại sao câu hỏi này bị đóng? Có điều gì sai với các câu hỏi về cảnh báo trình biên dịch C++ không? (Nếu câu trả lời là "không" thì đó là câu trả lời hoàn toàn hợp lệ sau tất cả ..) – Mehrdad

+12

@Mehrdad: ___Tôi không nghĩ có gì sai với câu hỏi này .___ Nếu nó thực sự bị đóng, nó sẽ được mở cửa trở lại. – sbi

Trả lời

21

C++ 11 gần như đã có những gì bạn muốn.

Nguyên từ khóa override là một phần của một đề nghị lớn hơn (N2928) trong đó cũng có khả năng để thực thi việc sử dụng của nó:

class A 
{ 
    virtual void f(); 
}; 

class B [[base_check]] : public A 
{ 
    void f(); // error! 
}; 

class C [[base_check]] : public A 
{ 
    void f [[override]](); // OK 
}; 

Thuộc tính base_check sẽ làm cho nó một lỗi để ghi đè lên một hàm ảo mà không sử dụng override từ khóa.

Ngoài ra còn có thuộc tính hiding cho biết chức năng ẩn chức năng trong lớp cơ sở. Nếu base_check được sử dụng và chức năng ẩn một từ lớp cơ sở mà không sử dụng hiding đó là lỗi.

Nhưng hầu hết đề xuất đã bị hủy và chỉ các tính năng finaloverride được giữ nguyên, như "số nhận dạng có ý nghĩa đặc biệt" thay vì thuộc tính.

+1

Đề xuất này có đang được xem xét lại để sửa đổi tiêu chuẩn trong tương lai không? – Xeo

+3

@Xeo: Nếu không có ai vận động hành lang cho nó, nó sẽ không được xem xét. Cá nhân tôi chỉ cần đặt nó vào achecker, ví dụ, dựa trên tiếng kêu và kiểm tra bắt buộc. –

+0

Không * khá * trả lời câu hỏi (vì mặc dù nó không có trong C++ 11, Visual C++ vẫn có thể có một số loại cảnh báo tôi không biết), nhưng vẫn còn thông tin tốt, cảm ơn. +1 – Mehrdad

4

Có vài cách để thực hiện việc này theo VC++ và các cách tương đương với GCC.

VC++

Dưới đây là những con số cảnh báo có liên quan trong VC++:

C4263 (level 4) 'function': member function does not override any base class virtual member function 
C4266 (level 4) 'function': no override available for virtual member function from base 'type'; function is hidden 

Để kích hoạt hai cảnh báo này, bạn có thể sử dụng một trong những tùy chọn sau:

  1. Set mức cảnh báo đến 4 trong cài đặt dự án và sau đó vô hiệu hóa các cảnh báo bạn không muốn. Đây là cách tôi thích. Để vô hiệu hóa cảnh báo Cấp 4 không mong muốn, hãy chuyển đến cài đặt dự án> C/C++> Nâng cao và sau đó nhập số cảnh báo trong hộp Vô hiệu cảnh báo cụ thể.
  2. Bật hai cảnh báo trên bằng mã.

    #pragma warning(default:4263) 
    #pragma warning(default:4266) 
    
  3. Bật hai cảnh báo trong cài đặt dự án> C/C++> Dòng lệnh và sau đó nhập/w34263/w34266. Ở đây/tùy chọn wNxxxx có nghĩa là bật cảnh báo xxxx ở Cấp N (N = 3 là mức mặc định). Bạn cũng có thể làm/wdNxxxx mà vô hiệu hóa các cảnh báo xxxx ở mức N.

GCC

GCC 5.1 trở lên đã bổ sung mới cảnh báo đề nghị ghi đè mà bạn có thể vượt qua như dòng lệnh tùy chọn -Wsuggest-override.

Clang

Clang 3.5+ có -Winconsistent-missing-override tuy nhiên điều này chỉ phát hiện trường hợp nếu lớp cơ sở sử dụng ghi đè lên nhưng mẹ thì không. Bạn có thể muốn xem xét công cụ clang-gọn gàng.

+4

Các cảnh báo VC++ đó dành cho _including_ ghi đè nơi không áp dụng. Câu hỏi đã yêu cầu cảnh báo về ghi đè _missing_. – mskfisher

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