इस कोड है:सी ++ में ऑब्जेक्ट स्लाइसिंग के लिए संभावित कार्यवाही क्या है?
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class A {
public:
virtual const string f() const { return "A"; }
};
class B : public A {
public:
const string f() const { return "B"; }
};
int main(int ac, char** av) {
vector<A> v;
v.push_back(B());
cout << v.at(0).f() << endl;
return 0;
}
अपेक्षित परिणाम B
है, लेकिन यह A
है। जैसा कि मैं समझता हूं ऑब्जेक्ट स्लाइसिंग हो रहा है। इससे कैसे बचें? क्या मैं ऑब्जेक्ट इंस्टेंस के बजाय vector
में पॉइंटर्स स्टोर करूं? क्या यह एकमात्र विकल्प है?
ऑब्जेक्ट स्लाइसिंग, हालांकि यहां हो रहा है, गलत परिणाम का कारण नहीं है, यह सदस्य ऑपरेटर (।) द्वारा फ़ंक्शन आमंत्रण है। वर्चुअल फ़ंक्शंस को सदस्य-बाय-पॉइंटर ऑपरेटर (->) (को छोड़कर) संदर्भों का उपयोग करते समय) – Ozan
@ ओज़न: बकवास। किसी अन्य सदस्य फ़ंक्शन (आभासी या नहीं) से वर्चुअल सदस्य फ़ंक्शन को कॉल करने से वर्चुअल कॉल भी होगा। – MSalters
हां, मैं सिर्फ विनसेन्जो को इंगित करना चाहता था कि सदस्य ऑपरेटर का उपयोग करके, स्लाइसिंग ऑब्जेक्ट नहीं, अपराधी था। यह एक आम गलती है जब जावा/सी # लोग सी ++ – Ozan