2009-01-11 24 views
5
#include <iostream> 
using namespace std; 

class Base 
{ 
    public: 
     Base(){cout <<"Base"<<endl;} 
     virtual ~Base(){cout<<"~Base"<<endl;} 
     virtual void foo(){ cout<<"foo base"<<endl;} 
}; 

class Derived: private Base 
{ 
    public: 
     Derived(){cout<<"Derived"<<endl;} 
     virtual ~Derived(){cout<<"~Derived"<<endl;} 
     virtual void foo(){ cout<<"foo dervied"<<endl;} 
}; 


int main(int argc, char *argv[]) 
{ 
    Base *pb = new Derived; 
    Derived d; 
    d.foo(); 
    return 0; 
} 

जब मैं ऊपर नमूना कार्यक्रम क्रियान्वित मैं त्रुटि निम्न हो: protected.cpp: 'int मुख्य (int, चार **)' समारोह में: protected.cpp: 26: त्रुटि: ' बेस '' व्युत्पन्न 'का एक अप्राप्य आधार हैसंरक्षित व्युत्पन्न वर्ग

बेस पॉइंटर के साथ व्युत्पन्न वस्तु बनाना क्यों संभव नहीं है ????


तो मैं

Derived d 
Derived d1= new Derived; 

तरह व्युत्पन्न वर्ग का instanse बना सकते हैं लेकिन जैसे

Base * b = new derived 

बेस वर्ग सूचक से उदाहरण बनाकर असफल हो जायेगी।

ऐसा इसलिए है क्योंकि व्युत्पन्न और व्यक्तिगत रूप से व्युत्पन्न होने पर व्युत्पन्न आधार से व्युत्पन्न वर्ग नहीं है ??

क्या यह सही है ?????

+0

इस प्रश्न को 3 डाउनवॉट क्यों मिले? यह एक बिल्कुल वैध सवाल है। +1, हास्यास्पद। – mstrobl

उत्तर

6

Why its not possible to create Derived object with base pointer????

क्योंकि आधार private है। यह आपकी कक्षा को बाहर से Base उदाहरण के रूप में इलाज करने से मना कर देता है। बाहर से देखा गया, आपकी कक्षा DerivedBase का उप-वर्ग, केवल कक्षा के भीतर से ही है।

protected विरासत के लिए एक ही मायने रखता है, फर्क सिर्फ इतना है कि के साथ आधार वर्ग अब नहीं निजी ही वर्ग के लिए किसी भी अधिक नहीं है बल्कि किसी भी व्युत्पन्न वर्ग के लिए भी है। हालांकि बाहर के लिए, यह निजी विरासत की तरह व्यवहार करता है।

4

आप सी ++ और विरासत पर this faq पर एक नज़र डालना चाहते हैं। विशेष रूप से अनुभाग 24.5 और 24.6

0

So I can create an instanse of Derived class like

Derived d Derived d1= new Derived; But creating instance from Base class pointer like

Base * b = new derived will fail.

This is because Derived is not actaully a derived class from Base when derived procted and privately??

Is this correct?????

यह बिल्कुल कॉनराड समझाया गया है।

यह वास्तविकता अभी भी आधार से लिया गया है। इसे सत्यापित करने के लिए, यदि आप व्युत्पन्न में वर्चुअल विधियों को ओवरराइड नहीं करते हैं तो बेस संस्करणों को कॉल किया जाएगा।

हालांकि, चूंकि आपने बेस को संरक्षित के रूप में घोषित किया है, इसलिए संकलक आपको स्वचालित रूप से एक बेस * पर एक व्युत्पन्न * नहीं डालेगा क्योंकि बेस सुपरक्लास बाहरी रूप से दिखाई नहीं दे रहा है।

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