शीर्षक यह सब कुछ कहता है। असल में, यह कानूनी ऐसा करने के लिए है:सी ++: वेक्टर <Base> में व्युत्पन्न प्रकार की वस्तुएं हो सकती हैं?
class Base {
//stuff
}
class Derived: public Base {
//more stuff
}
vector<Base> foo;
Derived bar;
foo.push_back(bar);
अन्य पदों मैंने देखा है के आधार पर, निम्न ठीक है, लेकिन मैं क्योंकि यह सुरक्षित धागा बनाने के लिए कठिन है इस मामले में संकेत का उपयोग नहीं करना चाहते हैं ।
vector<Base*> foo;
Derived* bar = new Derived;
foo.push_back(bar);
क्यों thread- है सुरक्षा किसी भी तरह से प्रासंगिक यहाँ? क्या आपका मतलब अपवाद-सुरक्षा शायद था? यदि हां, तो, 'push_back' एक अपवाद फेंक सकता है, जो एक खतरनाक सूचक को छोड़ देता है। आप इसे संभालने के लिए स्मार्ट पॉइंटर्स का उपयोग कर सकते हैं। – DanielKO
@DanielKO मैं एक निर्माता और उपभोक्ता धागे के बीच एक बफर के रूप में एक एसटीएल कंटेनर का उपयोग कर रहा हूँ। मैं कंटेनर को पॉइंटर्स से भरना नहीं चाहता हूं क्योंकि भले ही मैंने कंटेनर को म्यूटेक्स से सुरक्षित रखा हो, भले ही किसी थ्रेड में किसी अन्य डेटा के पॉइंटर हों, तो डेटा सुरक्षित नहीं है। – Beezum
वह स्वयं थ्रेड-सुरक्षा समस्या नहीं है। पॉइंटर्स के बिना भी कोई थ्रेड-असुरक्षित तरीके से तत्वों के साथ गड़बड़ कर सकता है। आपको केवल उचित अर्थशास्त्र परिभाषित करना है ताकि सामग्री (पॉइंटर्स या सीधे के रूप में संग्रहीत) उचित समरूपता स्थिरता तंत्र के बिना संशोधित नहीं की जा सके। विशेष रूप से, यदि आप डरते हैं कि कक्षा का कोई उपयोगकर्ता "अनुमति" के बिना तत्व को पॉइंटर स्टोर कर सकता है, तो आपको क्या लगता है कि वह एक सूचक या संदर्भ को उसी तरह नहीं लेगा? – DanielKO