अंतिम गैर-आभासी कार्यों पर लागू नहीं किया जा सकता है।
error: only virtual member functions can be marked 'final'
गैर-आभासी पद्धति को 'अंतिम' के रूप में चिह्नित करने में सक्षम होना बहुत सार्थक नहीं होगा। दिया हुआ
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()
हमेशा फोन करेंगे A::foo
।
लेकिन, अगर A :: foo था virtual
, तो B :: foo इसे ओवरराइड कर देगा। यह अवांछनीय हो सकता है, और इसलिए यह वर्चुअल फ़ंक्शन को अंतिम बनाने के लिए समझ में आएगा।
सवाल यह है कि आभासी कार्यों पर अंतिम अनुमति क्यों दी जाती है। यदि आपके पास एक गहरी पदानुक्रम है:
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 */ };
फिर final
ओवरराइडिंग कितनी हो सकती है, इस पर एक 'मंजिल' डालता है। अन्य वर्ग ए और बी का विस्तार कर सकते हैं और उनके ओवरराइड कर सकते हैं foo
, लेकिन यह एक वर्ग सी का विस्तार करता है तो इसकी अनुमति नहीं है।
तो यह शायद 'टॉप-लेवल' फू final
बनाने के लिए समझ में नहीं आता है, लेकिन यह समझ कम कर सकता है।
(मुझे लगता है कि हालांकि, शब्दों को अंतिम रूप देने और गैर-आभासी सदस्यों को ओवरराइड करने के लिए जगह है। हालांकि उनका एक अलग अर्थ होगा)।
virtual
कीवर्ड का उपयोग करते हैं या नहीं।