मुझे उम्मीद है कि foo
कक्षा D
में घोषित किया गया है, लेकिन वर्चुअल चिह्नित नहीं है, तो निम्न कोड foo
D
में कार्यान्वित करने के लिए कॉल करेगा (चाहे d
के गतिशील प्रकार के बावजूद)।सी ++ में, एक फ़ंक्शन स्वचालित रूप से आभासी है यदि यह वर्चुअल फ़ंक्शन को ओवरराइड करता है?
D& d = ...;
d.foo();
हालांकि, निम्नलिखित कार्यक्रम में, ऐसा नहीं है। क्या कोई इसे समझा सकता है? क्या यह विधि स्वचालित रूप से आभासी है यदि यह वर्चुअल फ़ंक्शन को ओवरराइड करता है?
#include <iostream>
using namespace std;
class C {
public:
virtual void foo() { cout << "C" << endl; }
};
class D : public C {
public:
void foo() { cout << "D" << endl; }
};
class E : public D {
public:
void foo() { cout << "E" << endl; }
};
int main(int argc, char **argv)
{
E& e = *new E;
D& d = *static_cast<D*>(&e);
d.foo();
return 0;
}
उपरोक्त कार्यक्रम के उत्पादन में है:
E
static_cast ज़रूरत से ज़्यादा है - 'डी एंड डी = * static_cast (&e);' 'डी एंड डी = ई के बराबर है, ई */ई से निहित डाली और करने के लिए डी * के कारण'/डी & –
सी ++ में फंक्शन घोषणा में "ओवरराइड" जोड़ने से बेस क्लास फ़ंक्शन को ओवरराइड करने का आपका इरादा स्पष्ट हो जाता है। यह आपके द्वारा घोषित किए गए फ़ंक्शन को बेस से स्थिरता में भिन्न करता है (कुछ ऐसा जो कर सकता है यदि आप std :: अपवाद से उदाहरण प्राप्त करते हैं तो आपको आश्चर्यचकित करें और घोषणा करें कि() गैर-कॉन्स) – Ghita