2017-01-08 6 views
6

यदि मैं व्युत्पन्न कक्षा का ऑब्जेक्ट पास कर रहा हूं, तो व्युत्पन्न क्लास कैच ब्लॉक को बुलाया जाना चाहिए। लेकिन आउटपुट का कहना है कि अपवाद बेस क्लास द्वारा पकड़ा जाता है। क्यूं कर?जब मैं व्युत्पन्न वर्ग की वस्तु फेंक रहा हूं तो आधार वर्ग का ब्लॉक क्यों अपवाद पकड़ रहा है?

#include<iostream> 
using namespace std; 

class Base {}; 
class Derived: public Base {}; 
int main() 
{ 
    Derived d; 
    // some other stuff 
    try { 
     // Some monitored code 
     throw d; 
    } 
    catch(Base b) { 
     cout<<"Caught Base Exception"; 
    } 
    catch(Derived d) { //This catch block is NEVER executed 
     cout<<"Caught Derived Exception"; 
    } 
    getchar(); 
    return 0; 
} 
+1

आपको मूल आधार के साथ ऊपरी मामले के साथ पकड़ लेना चाहिए। वे अधिभारित नहीं हैं। –

+1

डुप्ली नहीं, 'पकड़' खंड अलग हैं। – Oktalist

+0

[स्काईपैकैक से वही जवाब] (http://stackoverflow.com/a/39537680/366904) डुप्ली में। –

उत्तर

10

मानक का कहना है की जरूरत है कि व्युत्पन्न अपवाद की एक बहुत ही विशेष सुविधा है (देखें [except.handle]/4] एक उदाहरण के रूप काम मसौदा, जोर मेरा):

एक कोशिश ब्लॉक के लिए हैंडलर उपस्थिति के क्रम में कोशिश की जाती है। [नोट: इससे हैंडलर लिखना संभव हो जाता है जिन्हें निष्पादित नहीं किया जा सकता है, उदाहरण के लिए एक संगत सार्वजनिक बेस क्लास के लिए हैंडलर के बाद अंतिम व्युत्पन्न कक्षा के लिए एक हैंडलर रखकर।

यह वही है जो आपने अपने कोड में किया था।
इसलिए मैं कहूंगा कि यह इरादा व्यवहार है, इससे कोई फर्क नहीं पड़ता कि आपकी अपेक्षाएं क्या थीं।

ध्यान दें कि आप इस समस्या को हल करने के लिए दो हैंडलर स्वैप कर सकते हैं।

+0

[डीजा वीयू] (http://stackoverflow.com/a/39537680/366904) –

+0

@ कोडीग्रे दिलचस्प। मुझे उस जवाब को ईमानदारी से याद नहीं आया, लेकिन यह देखना मजाकिया है कि मैंने एक ही पैटर्न को कम अयस्क का पालन किया। क्या मुझे इसे हटा देना चाहिए? एक समस्या नहीं है। – skypjack

+0

नहीं, आपको हटाना नहीं है। मैंने केवल आपका जवाब देखा जब मैंने इसे एक डुप्लिकेट के रूप में बंद करने के लिए एक प्रश्न की खोज की। बंद होने का ख्याल रखा है, इसलिए सब कुछ अच्छा है। मैंने सोचा कि यह देखना मजेदार हो सकता है कि आप सुसंगत हैं। :-) –

1

कैच क्लॉज क्रम में चेक किए जाते हैं - आपको पहला मैच मिलता है, सर्वोत्तम मिलान नहीं।

तो पहले व्युत्पन्न प्रकार की जांच करना उसे पकड़ लेगा।

3

इस बारे में कुछ कहना नहीं है।

सबसे पहले, मूल्य के बजाय संदर्भ द्वारा अपवादों को पकड़ना अच्छा अभ्यास है। यह अपवाद ऑब्जेक्ट की स्लाइसिंग को उस स्थिति में रोकता है जब यह व्युत्पन्न होता है। यह अपवादों के लिए विशिष्ट नहीं है बल्कि विरासत की एक सामान्य विशेषता है।

इस घटना का विवरण here चर्चा की है

इसके अलावा, के रूप में, एक और उत्तर से कहा अगर आप चीजों को इस तरह से आप कैच का क्रम बदलने की जरूरत है क्या कर रही पर जोर देते हैं के रूप में एक व्युत्पन्न वर्ग आधार पकड़ को संतुष्ट करता है ब्लॉक। ऐसा करने का एक और तरीका है हालांकि यह इस संपत्ति का स्पष्ट रूप से उपयोग करता है: बस बेस क्लास को सब कुछ पकड़ो। आप इस का उपयोग कर सकते हैं जब तक कि वहाँ अलग से इलाज किया जाना

संबंधित मुद्दे