programming - c++ in english



किसी भी शुद्ध आभासी तरीकों के बिना एक वर्ग अमूर्त बनाना (4)

आधार के निर्माता को संरक्षित के रूप में निर्दिष्ट करें। इसका मतलब यह है कि आप इसे सीधे निर्माण नहीं कर सकते हैं, लेकिन विरासत को मजबूर करते हैं। कुछ भी नहीं है जो एक डेवलपर को उस वर्ग से अलग कर देता है, हालांकि अच्छे प्रलेखन से!

उदाहरण:

struct Abstract {
protected:
    Abstract() {}
};

struct Valid: public Abstract {
    // No need to override anything.
};


int main() {
    // Abstract a;  // This line fails constructor is protected
    Valid v;  // This compiles fine.
}

https://ffff65535.com

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

क्या इसे करने का कोई तरीका है?

धन्यवाद


आप उपयोगकर्ता को विरासत में क्यों लेना चाहते हैं, अगर उसे कुछ भी लागू नहीं करना है।

जब बेस क्लास को सभी "इवेंटहैंडलर" को एक std :: set में डालने में सक्षम होना चाहिए। फिर कोई भी आपके आधार वर्ग को उप-वर्ग किए बिना एक वर्ग नहीं बना सकता है और इसे इस सेट में डाल सकता है। क्योंकि सेट के रूप में परिभाषित किया जाएगा

std::set<MyBaseClass*> mySet;

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

class Base
{
public:
    virtual ~Base() = 0;
    virtual void SomeVirtualMethod();
};

inline Base::~Base()
{
}

class Derived : public Base
{
};

inline Base* createBase()
{
    // return new Base; // <- This won't compile
    return new Derived; // <- This compile, Derived is not a pure virtual class !
}

परिभाषा के अनुसार, एक अमूर्त वर्ग एक ऐसा वर्ग है जिसमें कम से कम एक शुद्ध आभासी कार्य होता है। अपने उद्देश्य के लिए, आप विध्वंसक को शुद्ध आभासी होने के लिए परिभाषित कर सकते हैं, और एक कार्यान्वयन प्रदान कर सकते हैं:

class abstract { 
        virtual ~abstract()=0; 
}; 

abstract::~abstract() {} 

डिफ़ॉल्ट रूप से, सभी विरासत वाली कक्षाएं अमूर्त नहीं होंगी, भले ही उन्हें किसी भी तरीके को लागू करने की आवश्यकता नहीं होगी।





c++