2016-02-19 15 views
26

Giả sử tôi có lớp A với một chức năng ảo F():Sự khác nhau giữa xác định lại và trọng một hàm

class A 
{ 
    virtual void F() 
    { 
     // Do something 
    }; 
}; 

Và tôi có một lớp B mà thừa hưởng Ađịnh nghĩa lạiF():

class B : A 
{ 
    void F() 
    { 
     // Do something 
    }; 
}; 

Và một lớp khác nhau C cũng thừa kế A nhưng ghi đè F():

class C : A 
{ 
    void F() override 
    { 
     // Do something 
    }; 
}; 

sự khác biệt giữa F() trong lớp BC là gì?

Trả lời

24

Cả hai B::f()C::f() là ghi đè và chúng là chính xác giống nhau.

override bản chất là một thời gian biên dịch tư vấn hạn đó sẽ gây ra một lỗi biên dịch nếu chức năng làm không override một trong một lớp cơ sở.

Điều này có thể giúp ổn định chương trình: nếu tên và loại thông số thành A::f() bị thay đổi, thì lỗi biên dịch sẽ dẫn đến kết quả.

29

Cả hai đều ghi đè.

Khi bạn sử dụng từ khóa override bạn đảm bảo lỗi biên dịch nếu xảy ra không phải là là ghi đè.

Và đó là thực hành tốt.

+3

Chưa kể đến yếu tố dễ đọc khi kho lưu trữ perusing như git – Tgsmith61591

+0

@ Tgsmith61591: Có. Tôi cũng tự hỏi liệu có bao gồm một ví dụ về cách quá tải (về cơ bản "định nghĩa lại") mà không ghi đè hay không. Nhưng tôi quyết định súc tích. :) –

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