2011-12-08 10 views
14

तो यह मेरे पास एक बड़ी असाइनमेंट का एक छोटा सा हिस्सा है, मैं इसके लिए सिंटैक्स के बारे में अनिश्चित हूं।सी ++, मैं व्युत्पन्न कक्षा में बेस क्लास के ओवरलोडेड निष्कर्षण ऑपरेटर को कैसे कॉल करूं?

मैं एक आधार वर्ग Vehicle नामित है, जो इन सदस्य हैं है: int fuelAmt और int fuelUsage)

(मैं उपयोग कर रहा हूँ नाम स्थान std)

मैं << ऑपरेटर इस तरह से अतिभारित:

ostream& operator<<(ostream& osObject, const Vehicle& myVehicle) 
{ 
    cout << "Fuel Usage Rate: " << myVehicle.fuelUsage << endl 
     << "Fuel Amount:  " << myVehicle.fuelAmt << endl; 

    return osObject; 
} 

मैं इसे इस तरह से कॉल करता हूं:

cout << Vehicle; 

परिणाम (उदाहरण) है:

Fuel Usage Rate: 10; 
Fuel Amount: 50; 

मैं भी एक Airplane वर्ग जो Vehicle वर्ग से निकला है, यह एक नए सदस्य का परिचय: int numEngines

मैं कैसे Airplane कक्षा में << ऑपरेटर को ओवरलोड कर सकते हैं, इतना है कि यह पहली "वाहन अतिभारित ऑपरेटर परिणाम" कहते हैं, और फिर जो कुछ के परिणामों मैं व्युत्पन्न वर्ग से मुद्रित करने के लिए << ऑपरेटर बता ... तो, यहाँ है कि मैं क्या मतलब है:

मैं इसे Airplane कक्षा में इस तरह कार्य करने की जरूरत है:

ostream& operator<<(ostream& osObject, const Airplane& myAirplane) 
{ 
     //First print the Fuel Usage rate and Fuel amount by calling 
     //the Base class overloaded << function 

     //then 
     cout << "Number of Engines: " << myAirplane.numEngines << endl; 

    return osObject; 
} 

मैं अपने सदस्यों 'मूल्यों outputting के आधार वर्ग निष्पादन कैसे को गति प्रदान करते हैं इस व्युत्पन्न वर्ग में,?

क्या यह हेडर बदलने जैसा कुछ है? इस तरह:

ostream& operator<<(ostream& osObject, const Airplane& myAirplane): operator<<Vehicle 
+1

वाहन ऑपरेटर में << के लिए आप के बारे में काम करेंगे केवल आधार वर्ग और आभासी प्रेषण के लिए ऑपरेटर < < है अदालत। आपको osObject को लिखना चाहिए। – user763305

उत्तर

16

कैसे निम्नलिखित के बारे में:

ostream& operator<<(ostream& osObject, const Airplane& myAirplane) 
{ 
    osObject << static_cast<const Vehicle &>(myAirplane); 
    osObject << "Number of Engines: " << myAirplane.numEngines << endl; 

    return osObject; 
} 
+0

आपको 'कॉन्स वाहन' और ' –

+0

@ आर्ममेन टीरुनियन में डाला जाना चाहिए: आपके सुझाव –

+0

के साथ अपडेट किया गया जवाब '' '' 'static_cast (यह)' 'my_irplane' के साथ प्रतिस्थापित नहीं किया जाना चाहिए? इसी तरह 'एयरप्लेन.नमइंजइन्स 'के बजाय' myAirplane.numEngines' नहीं होना चाहिए? – yasouser

16

ऑपरेटर < < एक nonmember समारोह है के बाद से, आप इसे आभासी की घोषणा नहीं कर सकते हैं, जो कि आप आदर्श क्या चाहते हैं। तो आप निम्नलिखित

class Base 
{ 
public: 
    virtual std::ostream& output(std::ostream& out) const 
    { 
     return out << "Base"; 
    } 
    virtual ~Base() {} //Let's not forget to have destructor virtual 
}; 

class Derived : public Base 
{ 
public: 
    virtual std::ostream& output(std::ostream& out) const 
    { 
     Base::output(out); //<------------------------ 
     return out << "DerivedPart"; 
    } 
    virtual ~Derived() {} //Let's not forget to have destructor virtual 
}; 

और अंत में करते हैं, अपना जादू

std::ostream& operator << (std::ostream& out, const Base& b) 
{ 
    return b.output(out); 
} 
1
ostream& operator<<(ostream& osObject, const Airplane& myAirplane) 
{ 
    //First print the Fuel Usage rate and Fuel amount by calling 
    //the Base class overloaded << function 
    cout << (Vehicle&) myAirplane; 

    //then 
    cout << "Number of Engines: " << myAirplane.numEngines << endl; 

    return osObject; 
} 
संबंधित मुद्दे