Trong variousexplanations của C++ 11's final
từ khóa, tôi thấy các ví dụ như thế này.Có ý nghĩa nào trong việc đánh dấu một hàm lớp cơ sở như cả ảo và cuối cùng không?
class base
{
public:
virtual void f() final;
};
class derived : public base
{
public:
virtual void f(); // Illegal due to base::f() declared final.
};
Đây có phải là sử dụng hữu ích của final
không? Tại sao bạn khai báo một hàm ảo trong một lớp cơ sở (ngụ ý rằng nó sẽ được overrideable một cách hữu ích trong các lớp dẫn xuất) và sau đó ngay lập tức đánh dấu nó là final
(phủ nhận hàm ý đó)? Tiện ích của virtual void f() final
là gì?
Tôi có thể thấy giá trị của việc đánh dấu derived::f()
cuối cùng thay vì base::f()
. Trong trường hợp này, base::f()
có lẽ có lý do thiết kế tốt cho lý do tại sao f()
phải là ảo và derived::f()
riêng biệt có lý do thiết kế tốt cho lý do tại sao không có lớp nào có nguồn gốc cao hơn.
Nếu bạn không muốn hàm bị ghi đè đa hình, tại sao không chỉ để lại từ khóa ảo? Tất nhiên, các lớp dẫn xuất có thể vẫn ghi đè lên hàm không đa hình. Là mục đích của virtual void f() final
trong lớp cơ sở do đó để làm cho base::f()
vững chắc không thể ghi đè theo bất kỳ cách nào — hoặc là một hàm ảo hoặc không ảo? Nếu có, thì có vẻ hơi tiếc khi chúng tôi phải thêm từ khóa virtual
trong trường hợp này chỉ để cho phép sử dụng final
. Tôi nghĩ rằng sau đó nó sẽ là hợp pháp để đánh dấu các chức năng không phải ảo là cuối cùng.
Tại sao sử dụng virtual void f() final
cho hàm có nguồn gốc trong lớp cơ sở khi ý nghĩa của virtual
và ý nghĩa của final
có vẻ mâu thuẫn?
Ví dụ là * ví dụ *; họ dự định thể hiện tính năng của nó, không nhất thiết phải sử dụng nó như thế nào. Cách này chỉ sử dụng hai lớp để hiển thị 'final' có nghĩa là gì. Để sử dụng một ví dụ thế giới thực sẽ yêu cầu * ba *: một để bắt đầu ảo, một để lấy được từ nó và là 'final', và một phần ba để cố gắng lấy ra từ nó và quá tải nó. Cách này ngắn hơn. –
@NicolBolas Tôi hiểu mục đích của các ví dụ. Nhưng loại ví dụ cụ thể này cũng thể hiện một mô hình hữu ích để sử dụng? Đó là câu hỏi. – OldPeculier