Final tidak dapat diterapkan pada fungsi non-virtual.
error: only virtual member functions can be marked 'final'
Itu tidak akan sangat bermakna untuk dapat menandai metode non-virtual sebagai 'final'. Diberikan
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()
akan selalu menelepon A::foo
.
Tetapi, jika A :: foo adalah virtual
, maka B :: foo akan menimpanya. Ini mungkin tidak diinginkan, dan karenanya masuk akal untuk membuat fungsi virtual menjadi final.
Namun pertanyaannya adalah, mengapa memungkinkan final pada fungsi virtual. Jika Anda memiliki hierarki yang dalam:
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 */ };
Kemudian final
meletakkan 'lantai' pada seberapa banyak overriding dapat dilakukan. Kelas-kelas lain dapat memperluas A dan B dan menimpa mereka foo
, tetapi suatu kelas memperpanjang C maka itu tidak diizinkan.
Jadi mungkin tidak masuk akal untuk membuat foo 'top-level' final
, tetapi mungkin masuk akal lebih rendah.
(Saya pikir, ada ruang untuk memperluas kata-kata final dan menimpa ke anggota non-virtual. Mereka akan memiliki arti yang berbeda.)
virtual
kata kunci atau tidak.