2010-10-06 15 views
6

कहें कि मेरे पास Base नामक एक वर्ग है और इसे प्राप्त करने वाली कक्षा SuperBase कहलाती है। यह देखते हुए add एक Base* में ले जाता है कि, इनमें से किसी मान्य होगा:बेस क्लास वैधता कास्टिंग

SuperBase *super = new SuperBase; 
bases.add(super); 

या

SuperBase *super = new SuperBase; 
bases.add((Base*)super); 
+0

मैं इस प्रश्न के लिए एक अच्छा शीर्षक नहीं सोच सकता, लेकिन मुझे लगता है कि यह बेहतर है। अपरिभाषित व्यवहार के लिए – GManNickG

उत्तर

9

पहले काम करता है जब तक SuperBase के रूप में सार्वजनिक रूप से से प्राप्त करने के लिए, Base से निकला एक अंतर्निहित रूपांतरण के माध्यम से -base:

struct base { virtual ~base() {} }; 
struct derived : base {}; 

base* b = new derived; // okay 

रूप में अच्छी तरह दूसरा काम करता है, लेकिनके संरक्षण पर ध्यान नहीं देता:

struct derived : private base {}; // private base 

base* b = new derived; // not okay, base is private 
base* b = (base*)(new derived); // okay, but gross 

यदि यह private है, तो आप शायद यह करने के लिए डाली नहीं करना चाहिए।

+1

+1 – jmasterx

+0

यह सुनिश्चित करने के लिए कि आप अपरिभाषित व्यवहार से निपट नहीं रहे हैं, एक सी-शैली कास्ट '(बेस *) 'के बजाय' static_cast 'का उपयोग करें। –

+2

लेकिन यह सच नहीं है! (कम से कम सी ++ 03 में)। सी-स्टाइल कास्ट एक अप्राप्य आधार पर * * सही ढंग से काम करने की गारंटी है (यानी जैसे कि आधार सुलभ था)। परिणामी पॉइंटर 'बेस' प्रकार के बेस-क्लास उप-ऑब्जेक्ट के लिए एक वैध सूचक है और इसे सुरक्षित रूप से इस तरह उपयोग किया जा सकता है। अर्थात। सी-स्टाइल कास्ट इस मामले में 'reinterpret_cast' नहीं है, बल्कि एक' static_cast' है जो सुरक्षा को अनदेखा करता है। यह निश्चित रूप से एक खराब प्रोग्रामिंग अभ्यास है, क्योंकि यह सुरक्षा को अनदेखा करता है, लेकिन यह "काम करता है"। आप क्यों कहते हैं कि व्यवहार अपरिभाषित है? – AnT

1

दोनों मान्य हैं - एक बच्चे को उस स्थान पर उपयोग किया जा सकता है जहां माता-पिता के संदर्भ/सूचक की अपेक्षा की जाती है। इसे बहुरूपता कहा जाता है।

1

दोनों मान्य होंगे, हालांकि टाइप-कास्टिंग super से Base* आवश्यक नहीं है।

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