2012-01-04 70 views
5

Theo Wikipedia, trong ví dụ này:ghi đè Explicit và C++ 0x thức

struct Base { 
    virtual void some_func(float); 
}; 

struct Derived : Base { 
    virtual void some_func(float) override; 
}; 

Tôi nghĩ override không phải là một C++ từ khóa, vì vậy những gì nó thực sự nghĩa là gì? Chúng ta có thể đạt được điều tương tự mà không có từ khóa đó, vậy tại sao mọi người lại cần nó?

Ngoài ra còn có các từ khóa final mà vẫn chưa làm việc trên VS2010:

struct Base1 final { }; 

struct Derived1 : Base1 { }; // ill-formed because the class Base1 
          // has been marked final 
+1

Không bạn đọc mà bài wikipedia bạn liên kết đến? Nó giải thích tại sao từ khóa đó lại hữu ích. – Mat

+2

'niêm phong' là từ khóa của VC++ 2010 cho' final'. – ildjarn

+0

@ildjarn: Ở chế độ Microsoft C++/CLI hoặc chế độ Chuẩn C++ 11? – dalle

Trả lời

16

Trong C++ 11, overridefinal là "định danh với ý nghĩa đặc biệt". Chúng không phải là từ khóa và chỉ có được ý nghĩa đặc biệt nếu được sử dụng trong một ngữ cảnh cụ thể (khi khai báo các hàm ảo).

Ý tưởng là cho phép trình biên dịch bắt các loại lỗi nhất định bằng cách cho phép lập trình viên nêu rõ mục đích của chúng (ví dụ: ghi đè hàm ảo hiện có thay vì tạo một hàm mới).

Dưới đây là trích dẫn có liên quan từ tiêu chuẩn, với các ví dụ:

C++ 11 10,3 4 Nếu một hàm f ảo trong một số lớp B được đánh dấu bằng virt-specifier final và trong một lớp D bắt nguồn từ B một hàm D :: f ghi đè B :: f, chương trình bị hỏng. [Ví dụ:

struct B { 
virtual void f() const final; 
}; 
struct D : B { 
void f() const; // error: D::f attempts to override final B::f 
}; 

-end dụ]

5 Nếu một hàm ảo được đánh dấu với virt-specifier override và không ghi đè lên một hàm thành viên của một lớp cơ sở, chương trình là ill- hình thành. [Ví dụ:

struct B { 
virtual void f(int); 
}; 
struct D : B { 
void f(long) override; // error: wrong signature overriding B::f 
void f(int) override; // OK 
}; 

-end dụ]

+0

Cảm ơn, nhưng chức năng thứ hai chỉ hoạt động khi chữ ký bị bỏ qua f() ghi đè. (Tôi đã thử nghiệm nó trong trình soạn thảo của tôi), tuy nhiên tôi hiểu bây giờ :) – codekiddy

+0

Tôi đoán đó là một lỗi đánh máy. Đã chỉnh sửa. –

+0

@Drew: Chỉnh sửa của bạn là chính xác. : -] – ildjarn

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