मुझे बेस क्लास और फिर कई व्युत्पन्न कक्षाएं मिली हैं। मैं इन व्युत्पन्न कक्षाओं के लिए "< <" ऑपरेटर को अधिभारित करना चाहता हूं। सामान्य ऑपरेटरों के लिए, यानी '+', आभासी कार्य चाल करते हैं। मैं मानक सम्मेलन के रूप में समझता हूं किओवरलोडिंग << ऑपरेटरों और विरासत कक्षाएं
friend ostream& operator<<(ostream& out, MyClass& A);
मेरी कक्षा के भीतर घोषित करना है और फिर वर्ग के बाद फ़ंक्शन को परिभाषित करना है। एक प्राथमिकता मुझे लगता है कि उपरोक्त परिभाषा में वर्चुअल जोड़ने से यह काम करेगा, लेकिन कुछ विचारों के बाद (और मेरे कंपाइलर से त्रुटियां) मुझे एहसास है कि ज्यादा समझ में नहीं आता है।
मैंने परीक्षण मामले पर एक अलग प्रयास करने की कोशिश की, जहां सभी वर्ग के सदस्य सार्वजनिक हैं। उदाहरण के लिए: - आधार वर्ग ऑपरेटर < < व्युत्पन्न वर्ग ऑपरेटर के बजाय बुलाया जा रहा है
class Foo{
//bla
};
ostream& operator<<(ostream& out, Foo& foo){
cout << "Foo" << endl;
return foo;
}
class Bar : public Foo{
//bla
};
ostream& operator<<(ostream& out, Bar& bar){
cout << "Bar" << endl;
return bar;
}
///////////////////////
Bar bar = Bar();
cout << bar << endl; // outputs 'Foo', not 'Bar'
तो किसी तरह से इस "बहुरूपता बुरा चला गया है।" उपर्युक्त उदाहरण में, मैं व्युत्पन्न कक्षा के लिए सही ऑपरेटर कैसे कहूं? और अधिक आम तौर पर, अगर मेरी कक्षा में निजी सदस्य हैं, तो मैं रक्षा करना चाहता हूं, दोस्त मित्र का उपयोग करते समय ऑपरेटर ओवरलोडिंग को कैसे सही कर सकता हूं?
पूरी तरह से काम करता है। धन्यवाद। – andyInCambridge
मुझे लगता है कि इसमें दो त्रुटियां हैं। एक दोष एक बड़ी खामियां है, और दूसरा मामूली दोष है। पहले भारी दोष ... आपको कभी भी 'endl' में अदृश्य रूप से नहीं डालना चाहिए। 'endl' एक स्ट्रीम फ्लश को मजबूर करता है, जो कुछ परिस्थितियों में एक बड़ी प्रदर्शन समस्या हो सकती है। ''\ N'' का प्रयोग करें। यह केवल पोर्टेबल होने की गारंटी है (वास्तव में, 'endl' को '' \ n'' आउटपुट करने के संदर्भ में परिभाषित किया गया है, और फ्लश ओवरहेड नहीं लेता है। दूसरा, मैं यह करूँगा: 'वापस लौटें <<" Foo \ n ";' थोड़ा साफ महसूस करता है। यह पूरी तरह से पूरी चीज को '<<' संचालन की लंबी श्रृंखला में बदल देता है। – Omnifarious
@ ओम्निफिरियस मैं कभी भी 'ऑपरेटर' में 'एंडल' नहीं डालूंगा << 'ओवरलोड। मैं बस निम्नलिखित था ओपी का कोड –