2014-09-25 12 views
5
class A{ 
    public: 
    A(); 
    private: 
    ~A(); 
}; 

class B:public A{ 
    public: 
    B(){}; 
    private: 
    ~B(); 
}; 

int main() 
{ 
    return 0; 
} 

मैं इस तरह एक संकलन त्रुटि मिल गया है:क्यों व्युत्पन्न कन्स्ट्रक्टर को आधार विनाशक की आवश्यकता है?

test.cpp: In constructor 'B::B()': 
test.cpp:5:4: error: 'A::~A()' is private 
test.cpp:10:8: error: within this context 

मैं व्युत्पन्न निर्माता आधार नाशक आह्वान करने के लिए की जरूरत है पता है, इसलिए मैं public रूप A::A() निर्धारित किया है। हालांकि, संकलक शिकायत क्यों करता है कि इसे सार्वजनिक A::~A() की आवश्यकता है?

+0

@EdChum: नहीं, वह प्रश्न यह नहीं समझाता है कि व्युत्पन्न कन्स्ट्रक्टर को बेस-क्लास विनाशक तक पहुंच की आवश्यकता क्यों है। –

+0

@ माइकसेमोर हाँ, आप सही हैं, मेरे करीबी वोट को वापस लेना – EdChum

+0

आप * शायद * उस वर्ग का निर्माण नहीं कर सकते जिसे आप नष्ट नहीं कर सकते हैं और आप 'बी' को नष्ट नहीं कर सकते क्योंकि विनाशक को '~ ए()' तक पहुंच की आवश्यकता है जो आपको निजी है (आपको आवश्यकता है इसे संरक्षित करने के लिए या 'मित्र' वर्ग बी)। – firda

उत्तर

0

सार्वजनिक रूप से कन्स्ट्रक्टर और विनाशक घोषित करें (बेस क्लास कन्स्ट्रक्टर और डिज़ाइनर संरक्षित किया जा सकता है, अगर आप सुनिश्चित करते हैं कि केवल उप-वर्गों द्वारा बुलाया जाता है)। उपवर्गों जब निर्माण आधार वर्ग उदाहरण एक cubobject के रूप में बनाया है, इसलिए निर्माता के दोनों स्पष्ट या अस्पष्ट कॉल और नाशक

किया जाता है
4

निकटतम विनिर्देश मैं मिल सकता है here - 12.4.10 class.dtor है:

... एक कार्यक्रम से बीमार है अगर वर्ग प्रकार या सरणी का ऑब्जेक्ट घोषित किया गया है और कक्षा के लिए विनाशक घोषणा के बिंदु पर पहुंच योग्य नहीं है।

class Bprivate: ~A() उपयोग करने में सक्षम नहीं है, लेकिन परोक्षclass A घोषित करने, क्योंकि यह एक आधार वर्ग है (यह पहले सदस्य चर घोषित करने के रूप में लगभग एक ही है - खाली आधार अनुकूलन को छोड़कर)।

मैं एक भाषा वकील और नहीं एक देशी वक्ता, लेकिन दुर्गम आधार वर्ग नाशक नहीं कर रहा हूँ समस्या लगती है और इसके बाद के संस्करण समझा जा सकता है क्यों निर्माता B() (करने के लिए त्रुटि अंक संकलक चेकों जब प्रदर्शन कर सकते हैं वे वास्तव में पहले की जरूरत है, पहले नहीं)।

विनाशक ~A() कम से कम protected या BA के मित्र होने की आवश्यकता है।

3

सी ++ मानक समिति कोर कार्यदल दोष रिपोर्ट 1424 (2011-12-07 पर डैनियल Krügler द्वारा प्रस्तुत) का कहना है:

वर्तमान विनिर्देश कहने के लिए एक कार्यान्वयन की अनुमति दी/की आवश्यकता है प्रकट नहीं होता है/जब उप-ऑब्जेक्ट का विनाशक पहुंच योग्य नहीं होता है तो शिकायत करने के लिए मना किया जाता है।

यह एक नाशक जा रहा है संभावित लागू की धारणा के अलावा द्वारा सी ++ 14 में तय हो गई है। वर्तमान मसौदा मानक खंड 12.6.2 (10) का कहना है:

एक गैर सौंपने के निर्माता, प्रत्येक सीधा या आभासी आधार वर्ग के लिए और वर्ग प्रकार से प्रत्येक गैर स्थैतिक डेटा सदस्य के लिए नाशक संभावित रूप से लागू किया गया है (12.4)।

[नोट: यह प्रावधान सुनिश्चित करता है कि विनाशकर्ता पूरी तरह से निर्माण उप वस्तुओं के मामले में एक अपवाद फेंक दिया जाता है (15.2) के लिए बुलाया जा सकता है।अंत टिप्पणी]

और 12.4 (11) में:

एक नाशक संभावित शुरू हो जाती है अगर यह शुरू हो जाती है या 5.3.4 और 12.6.2 में विनिर्दिष्ट। यदि कोई विनाशक संभावित रूप से बुलाया जाता है तो हटाया जाता है या आमंत्रण के संदर्भ से सुलभ नहीं होता है।

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

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