मान लीजिए कि मेरे पास वर्चुअल फ़ंक्शन और व्युत्पन्न क्लास वाला क्लास है जो वर्चुअल फ़ंक्शन को एक अलग तरीके से लागू करता है। मान लीजिए कि मेरे पास व्युत्पन्न कक्षाओं को संग्रहीत करने के लिए उपयोग की जाने वाली बेस क्लास का वेक्टर भी है। मैं वेक्टर में व्युत्पन्न कक्षा के वर्चुअल फ़ंक्शन को कैसे पहले से जाने बिना व्युत्पन्न कक्षा क्या करूँगा? न्यूनतम कोड जो समस्या को दर्शाता है:सी ++: व्युत्पन्न वर्ग के वर्चुअल फ़ंक्शन को कॉल करना
#include <iostream>
#include <vector>
class Foo {
public:
virtual void do_stuff (void) {
std::cout << "Foo\n";
}
};
class Bar: public Foo {
public:
void do_stuff (void) {
std::cout << "Bar\n";
}
};
int main (void) {
std::vector <Foo> foo_vector;
Bar bar;
foo_vector.resize (1);
foo_vector [0] = bar;
bar.do_stuff(); /* prints Bar */
foo_vector [0].do_stuff(); /* prints Foo; should print Bar */
return 0;
}
ऑब्जेक्ट स्लाइसिंग से बचने के लिए शायद 'std :: vector' (पॉइंटर या संदर्भ द्वारा) का उपयोग कर? अन्यथा, जिस पल में आप वेक्टर को 'बार' ऑब्जेक्ट असाइन करते हैं, इसे काटा गया है (एक नया 'फू' बनाया गया है और आपके 'बार' के बजाय वेक्टर में संग्रहीत किया गया है), जो शायद आप नहीं चाहते हैं। पॉइंटर का उपयोग कोड को और अधिक जटिल बना देगा, हालांकि। –
rwong