Cuối cùng không thể được áp dụng cho các chức năng không ảo.
error: only virtual member functions can be marked 'final'
Sẽ không có ý nghĩa lắm khi có thể đánh dấu một phương thức không ảo là 'cuối cùng'. Được
struct A { void foo(); };
struct B : public A { void foo(); };
A * a = new B;
a -> foo(); // this will call A :: foo anyway, regardless of whether there is a B::foo
a->foo()
sẽ luôn gọi A::foo
.
Nhưng, nếu A :: foo là virtual
, thì B :: foo sẽ ghi đè lên nó. Điều này có thể là không mong muốn, và do đó sẽ có ý nghĩa để làm cho chức năng ảo cuối cùng.
Câu hỏi là mặc dù, tại sao cho phép cuối cùng trên các chức năng ảo. Nếu bạn có một hệ thống phân cấp sâu sắc:
struct A { virtual void foo(); };
struct B : public A { virtual void foo(); };
struct C : public B { virtual void foo() final; };
struct D : public C { /* cannot override foo */ };
Sau đó, việc final
đặt một "tầng" về mức độ ghi đè có thể được thực hiện. Các lớp khác có thể mở rộng A và B và ghi đè lên chúng foo
, nhưng lớp này mở rộng C thì không được phép.
Vì vậy, nó có thể không có ý nghĩa để làm cho foo 'cấp cao nhất' final
, nhưng nó có thể có ý nghĩa thấp hơn.
(Tôi nghĩ mặc dù, có chỗ để mở rộng các từ cuối cùng và ghi đè lên các thành viên không ảo. Mặc dù vậy, chúng sẽ có một ý nghĩa khác.)
virtual
từ khóa hay không.