2011-01-19 6 views
25

निम्नलिखित पैटर्न ठीक है/सुरक्षित है? या क्या कोई कमी है? (मैं भी समानता ऑपरेटरों के लिए इसका इस्तेमाल करते हैं)बेस क्लास के ऑपरेटिंग ऑपरेटरों ... सुरक्षित?

Derived& operator=(const Derived& rhs) 
{ 
    static_cast<Base&>(*this) = rhs; 
    // ... copy member variables of Derived 
    return *this; 
} 

उत्तर

38

यह ठीक है, लेकिन यह एक बहुत अधिक पठनीय IMHO नाम से आधार स्तरीय कॉल करने के लिए है:

Base::operator = (rhs); 
+0

वास्तव में ... बस देखा है कि इस अंकन परोक्ष परिभाषित assignement ऑपरेटरों रूप में अच्छी तरह से काम करता है के लिए (हमेशा यही लगता है कि यह केवल स्पष्ट रूप से परिभाषित लोगों के लिए काम करेगा) – smerlin

12

हाँ, यह सुरक्षित है।

एक अलग वाक्य रचना करने के लिए एक ही बात हो सकता है:

Base::operator=(rhs); 
+0

वास्तव में इस एक बेहतर तरीका है, तो कास्ट करने के लिए की जरूरत है। इसके अलावा, यह व्युत्पन्न कक्षाओं में किया जाना चाहिए –

1

कि उपयोग करना बेहतर है

Base::operator=(rhs); 

क्योंकि अगर आपकी आधार वर्ग एक शुद्ध आभासी विधि static_cast अनुमति न हो।

class Base { 
    // Attribute 
    public: 
     virtual void f() = 0; 
    protected: 
     Base& operator(const Base&); 
} 

class Derived { 
    public: 
     virtual void f() {}; 
     Derived& operator=(const Derived& src) { 
      Base::operator=(src); // work 
      static_cast<Base&>(*this) = src; // didn't work 
     } 
}