Final, sanal olmayan işlevlere uygulanamaz.
error: only virtual member functions can be marked 'final'
Sanal olmayan bir yöntemi 'final' olarak işaretlemek çok anlamlı olmazdı. verilmiş
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()
her zaman arayacaktır A::foo
.
Ancak, A :: foo olsaydı virtual
, B :: foo onu geçersiz kılardı. Bu istenmeyen bir durum olabilir ve bu nedenle sanal işlevi sonlandırmak mantıklı olacaktır.
Soru şu ki, neden sanal işlevlerde final yapılmasına izin veriyoruz. Derin bir hiyerarşiniz varsa:
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 */ };
Sonra final
ne kadar geçersiz kılmanın yapılabileceğine bir 'zemin' koyar. Diğer sınıflar A ve B'yi genişletip geçersiz kılabilir foo
, ancak bir sınıf C'yi genişletir, sonra izin verilmez.
Bu yüzden muhtemelen 'üst düzey' foo final
yapmak mantıklı değil, ama daha düşük olabilir.
(Sanırım son kelimeleri genişletmek ve sanal olmayan üyelere geçersiz kılmak için yer var. Yine de farklı bir anlamı olacaktı.)
virtual
anahtar kelimeyi kullanıp kullanmadığınız geçersiz kılma işlevleri dolaylı olarak sanaldır .