कृपया निम्नलिखित कोड पर विचार करें:अतिभारित आभासी समारोह कॉल संकल्प
class Abase{};
class A1:public Abase{};
class A2:public A1{};
//etc
class Bbase{
public:
virtual void f(Abase* a);
virtual void f(A1* a);
virtual void f(A2* a);
};
class B1:public Bbase{
public:
void f(A1* a);
};
class B2:public Bbase{
public:
void f(A2* a);
};
int main(){
A1* a1=new A1();
A2* a2=new A2();
Bbase* b1=new B1();
Bbase* b2=new B2();
b1->f(a1); // calls B1::f(A1*), ok
b2->f(a2); // calls B2::f(A2*), ok
b2->f(a1); // calls Bbase::f(A1*), ok
b1->f(a2); // calls Bbase::f(A2*), no- want B1::f(A1*)!
}
मुझे पता है क्यों सी ++ आधार के लिए वस्तु के this
सूचक upcasting द्वारा अंतिम पंक्ति पर समारोह कॉल को हल करने के लिए चुनता इच्छुक हूँ f()
के तर्क को उखाड़ फेंकने के बजाए कक्षा? क्या कोई तरीका है कि मैं जिस व्यवहार को चाहता हूं उसे प्राप्त कर सकता हूं?
धन्यवाद - जैसा कि मैं समझता हूं कि बिंदु यह है कि f() को दिए गए तर्क के आधार पर कॉल करने के लिए वर्चुअल एफ() कॉल का संकलन संकलन समय पर होता है। तो आखिरी पंक्ति पर, संकलक पहले से ही तय कर चुका है कि एफ (ए 2 *) कहा जाएगा। तब कहा जाता है कि एफ (ए 2 *) का संस्करण रनटाइम प्रकार पर निर्भर करता है। यहां, चूंकि कक्षा बी 1 एफ (ए 2 *) से अधिक नहीं है, बेस क्लास संस्करण कहा जाता है। – stw
@stw, बिल्कुल सही। –