वर्चुअल फ़ंक्शन का रिटर्न प्रकार बेस क्लास या कॉन्वेंट में समान प्रकार का होना चाहिए। लेकिन हमारे पास यह प्रतिबंध क्यों है?आभासी कार्यों के लिए अलग-अलग रिटर्न प्रकार
उत्तर
क्योंकि वापसी मूल्य का उपयोग करने वाला कोड कैसे असंबद्ध प्रकारों के सभी प्रकार के साथ सामना करेगा? उदा .:
class A
{
public:
virtual float func();
};
class B: public A
{
public:
virtual char *func();
};
A *p = (some_condition) ? new A() : new B();
p->func(); // Oh no! What is the type?
हां, असंबंधित प्रकार = खराब। अन्य संबंधित प्रकारों के बारे में क्या? – curiousguy
:
struct foo
{
virtual int get() const { return 0; }
};
struct bar : foo
{
std::string get() const { return "this certainly isn't an int"; }
};
int main()
{
bar b;
foo* f = &b;
int result = f->get(); // int, right? ...right?
}
यह एक व्युत्पन्न वर्ग वापसी कुछ पूरी तरह से असंबंधित है करने के लिए समझदार नहीं है।
चर्चा [चैट करने के लिए ले जाया गया।] (Http://chat.stackoverflow.com/rooms/15288/discussion-between-gmannickg-and-curiousguy) – GManNickG
चैट का निष्कर्ष: ** जीएमएनएनजीजी स्वीकार करता है कि वर्तमान सी ++ नियम जो केवल पॉइंटर्स (या संदर्भ) को आराम दिया जा सकता है। ** – curiousguy
"प्रवेश" नहीं, मैंने इसे पहले स्थान पर कभी भी इनकार नहीं किया ... – GManNickG
सी ++ मानक के अनुसार:
एक अधिभावी समारोह की वापसी प्रकार ओवरराइड func- tion या कार्यों की कक्षाओं के साथ covariant की वापसी प्रकार या तो समान होगा। एक समारोह डी :: च ओवरराइड करता है, तो एक समारोह बी :: च, कार्यों का वापसी प्रकार covariant हैं, बशर्ते वे निम्न मानदंडों को पूरा:
1) दोनों वर्गों की ओर इशारा या वर्गों के लिए संदर्भ
2) बी :: एफ के रिटर्न प्रकार में कक्षा डी :: एफ के रिटर्न प्रकार में कक्षा के समान कक्षा है, या कक्षा में अस्पष्ट और सुलभ प्रत्यक्ष या अप्रत्यक्ष आधार वर्ग है वापसी प्रकार का डी :: एफ
3) दोनों पॉइंटर्स या रेफरेंस एस के पास समान सीवी-योग्यता है और डी प्रकार के डी :: एफ के प्रकार के प्रकार में समान प्रकार की सीवी-योग्यता बी/एफ के रिटर्न प्रकार में कक्षा प्रकार की तुलना में समान सीवी-योग्यता है।
प्रश्न पहले से ही प्रतिबंध का अनुमान लगाता है, यह पूछ रहा है कि यह प्रतिबंध क्यों मौजूद है। – GManNickG
जवाब बहुत Bjarne Stroustrup के पूछे जाने वाले प्रश्न पर "Why can't I assign a vector<Apple*> to a vector<Fruit*>?" के लिए दिए गए एक के समान है।
वापसी प्रकार को संशोधित करने की क्षमता भाषा की प्रकार की सुरक्षा में एक छेद का कारण बनती है (पॉलिमॉर्फिक प्रकारों से निपटने के दौरान @GManNickG से एक विशिष्ट उदाहरण के लिए जवाब देखें)।
रिटर्न प्रकार को प्रभावित करते समय एक काफी आम स्थिति आदर्श होगी: मूल प्रकार की वर्चुअल विधि से पॉलीमोर्फिक पॉइंटर लौटने पर। उदाहरण के लिए,
class Base {
public:
virtual Base* parent() = 0;
};
class Child : public Base {
public:
Base* parent() override
{
return parent_;
}
private:
Parent* parent_; // Assume `Parent` type exists.
};
यहाँ हम प्रकार की जानकारी है कि Child
जानता है के बारे में यह parent_
सदस्य है खो दिया है। यह बहुत सारे कास्टिंग की ओर जाता है, भले ही प्रकार एक बिंदु पर अच्छी तरह से परिभाषित किया गया था। हम इस का उपयोग करते हुए Curiously Recurring Template Parameter (CRTP) मुहावरा हल कर सकते हैं,
template<class ParentType>
class Base {
public:
virtual ParentType* parent()
{
return parent_;
}
private:
ParentType* parent_;
};
class Child : public Base<Parent> {
};
"_ उत्तर उत्तर देने के लिए बहुत ही समान है" मैं वेक्टर
- 1. सी ++ आभासी फ़ंक्शन रिटर्न प्रकार
- 2. सी ++: निजी आभासी कार्यों बनाम शुद्ध आभासी कार्यों
- 3. आभासी कार्यों से बचें
- 4. सी ++ "आभासी कार्यों, लेकिन कोई आभासी विनाशकर्ता"
- 5. नाम छुपा और आभासी कार्यों
- 6. Async programmic और आभासी कार्यों
- 7. आभासी कार्यों के लिए संरेखण कैसे सेट करें?
- 8. विभिन्न प्रकार के कार्यों के लिए शब्दावली
- 9. टपल-फ़ंक्शंस के लिए स्कैला रिटर्न प्रकार
- 10. PHP में आभासी कार्यों का सही कार्यान्वयन?
- 11. आभासी कार्यों का उपयोग क्यों करें?
- 12. शरीर के साथ शुद्ध आभासी कार्यों के उपयोग के मामले?
- 13. प्रकार 'System.Int32' का अभिव्यक्ति रिटर्न प्रकार 'System.Object'
- 14. PHP में C++ के आभासी कार्यों के बराबर क्या है?
- 15. शून्य रिटर्न प्रकार
- 16. विधि रिटर्न प्रकार
- 17. गैर-इकाई रिटर्न प्रकार
- 18. सदस्य कार्यों के लिए decltype
- 19. बिल्कुल सही अग्रेषण - आभासी कार्यों के माध्यम से
- 20. आप एक रिटर्न प्रकार
- 21. डब्ल्यूसीएफ रिटर्न प्रकार
- 22. रिटर्न प्रकार पर ओवरलोडिंग?
- 23. सी ++ में शुद्ध आभासी कार्यों के उपयोग क्या हैं?
- 24. डब्ल्यूसीएफ, इंटरफ़ेस रिटर्न प्रकार और ज्ञात प्रकार
- 25. टेम्पलेट्स के लिए ऑपरेटर/फ़ंक्शन का डेडस रिटर्न प्रकार
- 26. मैप किए गए संग्रहीत प्रक्रिया के लिए अमान्य रिटर्न प्रकार
- 27. रिटर्न प्रकारों के लिए कंक्रीट प्रकार या इंटरफेस?
- 28. सी # सामान्य रिटर्न प्रकार होने के लिए संभव है?
- 29. सी ++ टाइपपीफ और रिटर्न प्रकार: टाइपिफ़ के साथ बनाए गए रिटर्न प्रकार को पहचानने के लिए कंपाइलर कैसे प्राप्त करें?
- 30. एक छोटे से जोड़े के लिए कैसे पूछें? (शुद्ध आभासी कार्यों का वाक्यविन्यास)
आप अधिभावी समारोह की वापसी प्रकार की उम्मीद होने की अनुमति दी ...? – curiousguy