public
कीवर्ड की आवश्यकता केवल class
कीवर्ड के साथ परिभाषित कक्षाओं के लिए है, डिफ़ॉल्ट एक्सेस संशोधक (सब कुछ के लिए - डेटा सदस्य, सदस्य कार्य, और आधार वर्ग) private
है। तो
class World : State {};
रूप में ही है:
class World : private State {};
और कहा कि शायद नहीं है कि आप क्या चाहते - इसका मतलब है कि आधार वर्ग वर्ग World
भीतर ही उपलब्ध है। बाहरी लोग "नहीं जानते" कि विरासत बिल्कुल है।
कीवर्ड struct
के साथ परिभाषित वर्गों के लिए, डिफ़ॉल्ट पहुँच संशोधक, public
है ताकि आप सकता है लिखने:
struct World : State {};
और कुछ पाने कि दोनों दिखता है और विरासत के साथ हर दूसरे भाषा की तरह एक सा व्यवहार करता है। लेकिन struct
कीवर्ड, और तथ्य यह है कि यह एक वर्ग को परिभाषित करता है, वास्तव में केवल सी के साथ संगतता के लिए है।आपको कई सी ++ शैली मार्गदर्शिकाएं नहीं मिलेंगी जो डिफ़ॉल्ट सार्वजनिक पहुंच प्राप्त करने के लिए इसका उपयोग करने की अनुशंसा करते हैं - आम तौर पर इसका उपयोग केवल उन वर्गों के लिए किया जाता है जो पीओडी हैं, या शायद केवल उन सदस्यों के लिए, जिनमें कोई सदस्य कार्य नहीं है।
क्यों सी ++ के पास पहली जगह निजी विरासत है: अधिकांश उद्देश्यों के लिए, निजी विरासत संरचना का एक रूप है। सामान्य रचना:
class World {
State state;
public:
void foo() {
state.bar();
state.baz();
and so on
}
};
है, वर्ग विश्व जानता है कि यह एक राज्य का उपयोग कर लागू किया गया है, और बाहर की दुनिया यह नहीं पता कि विश्व कार्यान्वित किया जाता है।
बनाम
class World : private State {
public:
void foo() {
bar();
baz();
and so on
}
};
है, वर्ग विश्व जानता है कि यह द्वारा जा रहा है किसी राज्य को लागू किया है, और बाहर की दुनिया नहीं जानती कि यह कैसे लागू हो जाता है। लेकिन आप चुनिंदा रूप से राज्य के इंटरफ़ेस के हिस्सों का पर्दाफाश कर सकते हैं उदाहरण के लिए using State::bar;
को विश्व की परिभाषा के सार्वजनिक भाग में डाल दें। प्रभाव यह है कि आप दुनिया में एक समारोह (या कई अधिभार) को श्रमिक रूप से लिखा होगा, जिनमें से प्रत्येक राज्य पर एक ही कार्य के लिए प्रतिनिधि है।
टाइपिंग से बचने के अलावा, निजी विरासत का एक आम उपयोग तब होता है जब कक्षा State
खाली है, यानी कोई डेटा सदस्य नहीं है। फिर यदि यह World
का सदस्य है, तो उसे कुछ जगह पर कब्जा कर लेना चाहिए (स्वीकार्य रूप से, ऑब्जेक्ट लेआउट के आधार पर यह ऐसी जगह हो सकती है जो अन्यथा केवल पैडिंग होगी, इसलिए यह World
के आकार को जरूरी नहीं है), लेकिन यदि यह बेस क्लास है फिर "खाली बेस क्लास ऑप्टिमाइज़ेशन" नामक एक चीज़ में शामिल होता है, और यह शून्य आकार का हो सकता है। यदि आप ऑब्जेक्ट्स के लॉट बना रहे हैं, तो इससे कोई फर्क नहीं पड़ता। निजी विरासत अनुकूलन को सक्षम बनाता है, लेकिन बाहरी दुनिया "एक-एक" रिश्ते का अनुमान नहीं लगाएगी, क्योंकि यह विरासत को नहीं देखती है।
यह एक बहुत अच्छा अंतर है - यदि संदेह में स्पष्ट संरचना का उपयोग करें। टाइपिंग को बचाने के लिए विरासत का परिचय देना बहुत अच्छा है जब तक कि इसका कुछ अप्रत्याशित परिणाम न हो।
क्या आप 'कक्षा विश्व: निजी राज्य {} 'लिखना चाहते थे? जो आपने वास्तव में लिखा था, वह विरासत सार्वजनिक है। –
क्या आपका मतलब 'वर्ग विश्व: निजी राज्य' था? – detunized
@Steve, @detunized मुझे मेरी बेवकूफ गलती के लिए खेद है। मैंने सवाल संशोधित किया। – Eonil