2010-11-17 20 views
9
class Material 
{ 
public: 
void foo() 
{ 
    cout << "Class Material"; 
} 
}; 

class Unusual_Material : public Material 
{ 
public: 
void foo() 
{ 
    cout << "Class Unusual_Material"; 
} 
}; 

int main() 
{ 
Material strange = Unusual_Material(); 
strange.foo(); //outputs "Class Material" 

return 0; 
} 

से कॉल व्युत्पन्न क्लास विधि कॉल करें, मैं इसके परिणामस्वरूप "कक्षा Unusual_Material" को कंसोल पर प्रदर्शित किया जा रहा हूं। क्या मैं इसे हासिल कर सकता हूं? मेरे कार्यक्रम में मेरे पास एक वर्ग सामग्री है जिसमें से अन्य विशिष्ट सामग्री व्युत्पन्न होती है। विधि सामग्री :: foo() सामग्री में एक विधि का प्रतिनिधित्व करता है जो अधिकांश सामग्रियों के लिए पर्याप्त है, लेकिन मौलिक रूप से, किसी अन्य foo() को असामान्य गुणों वाली सामग्री के लिए परिभाषित करने की आवश्यकता होती है।बेस क्लास संदर्भ

मेरे कार्यक्रम में सभी वस्तुओं में एक सामग्री क्षेत्र होता है। अगर उन्हें असामान्य सामग्री सौंपी जाती है, तो मुझे व्युत्पन्न, असामान्य फू को बुलाया जाना चाहिए।

यह शायद या तो बहुत आसान, या असंभव है, लेकिन मैं इसे किसी भी तरह से समझ नहीं सकता।

धन्यवाद

+1

एक नोट के रूप में, 'की तरह सामग्री अजीब = Unusual_Material() कोड;' वस्तु टुकड़ा करने की क्रिया समस्या हो सकती है: http://stackoverflow.com/questions/274626/क्या-द-द-स्लाइसिंग-समस्या-इन-सी – birryree

उत्तर

19

क्या आप चाहते हैं बहुरूपता है, और आप इसे virtual बनाने की जरूरत है एक समारोह के लिए इसे सक्षम करने के लिए:

int main() 
{ 
    Unusual_Material unusualMaterial; 
    Material& strange = unusualMaterial; 
    strange.foo(); 
    return 0; 
} 

/* OR */ 

int main() 
{ 
    Unusual_Material unusualMaterial; 
    Material* strange = &unusualMaterial; 
    strange->foo(); 
    return 0; 
} 
:

class Material 
{ 
public: 
    virtual void foo() // Note virtual keyword! 
    { 
     cout << "Class Material"; 
    } 
}; 

class Unusual_Material : public Material 
{ 
public: 
    void foo() // Will override foo() in the base class 
    { 
     cout << "Class Unusual_Material"; 
    } 
}; 

इसके अलावा, बहुरूपता केवल संदर्भ और संकेत के लिए काम करता है

आपके कोड स्निपेट में आपके पास क्या है slice the Unusual_Material object:

int main() 
{ 
    // Unusual_Material object will be sliced! 
    Material strange = Unusual_Material(); 
    strange.foo(); 
    return 0; 
} 
+1

आह! उसे इंगित करने के लिए धन्यवाद। मुझे लगता है कि मैं भूल गया था कि आभासी एक अमूर्त वर्ग को परिभाषित करने के लिए अधिक था। जल्दी उत्तर देने के लिए धन्यवाद! – user487100

+1

@ user487100: यह ठीक है, जब तक आप महसूस करते हैं कि क्या गलत हुआ। मैं अनुशंसा करता हूं कि आप [एक अच्छी सी ++ पुस्तक] उठाएं (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) हालांकि, इसमें इस मौलिक विषय को शामिल किया जाएगा बहुत अधिक विस्तार। –

+0

और मुझे स्लाइसिंग के बारे में कोई जानकारी नहीं थी। मैंने सोचा कि कार्यक्रम के पास व्युत्पन्न हिस्सों तक पहुंच नहीं होगी, लेकिन मुझे लगता है कि, संदर्भ का उपयोग नहीं करते समय, यह बहुत समझ में आता है। मेरे संपादन के अंत में उस बिट को जोड़ने के लिए धन्यवाद। – user487100

1

फिर भी बेहतर स्पष्टीकरण होगा ..

class Base 
{ 
public: 
void foo()  //make virtual void foo(),have derived method invoked 
{ 
    cout << "Class Base"; 
} 
}; 
class Derived: public Base 
{ 
public: 
void foo() 
{ 
    cout << "Class Derived"; 
} 
}; 
int main() 
{ 
Base base1 = Derived(); 
Base1.foo(); //outputs "Class Base" 
      // Base object, calling base method 

Base *base2 = new Derived(); 
Base2->foo(); //outputs"Class Base",Again Base object calling base method 

// But to have base object, calling Derived method, following are the ways 
// Add virtual access modifier for base foo() method. Then do as below, to //have derived method being invoked. 
// 
// Base *base2 = new Derived(); 
// Base2->foo(); //outputs "Class Derived" . 

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