मुझे विरासत कक्षाओं के shared_ptr
के बीच स्वचालित टाइपकास्टिंग के साथ कुछ समस्याएं आ रही हैं।std :: shared_ptr और विरासत
मेरी कक्षा संरचना निम्नानुसार है, बेस श्रेणी Base
और दो व्युत्पन्न कक्षा Derived1
और Derived2
।
// Base class
class Base {
protected:
...
...
public:
Base() = default;
virtual ~Base() = default;
virtual void run() = 0;
...
...
};
// Derived class
class Derived1: Base {
protected:
...
...
public:
Derived1() = default;
virtual ~Derived1() = default;
void run() {...}
...
...
};
// Derived class
class Derived2: Base {
protected:
...
...
public:
Derived2() = default;
virtual ~Derived2() = default;
void run() {...}
...
...
};
मैं एक समारोह doSomething()
void doSomething(std::shared_ptr<Base> ptr) {
ptr->run();
...
}
मैं तो जैसे व्युत्पन्न वर्ग के साथ समारोह कॉल -
doSomething(make_shared<Derived1>())
doSomething(make_shared<Derived2>())
लेकिन मैं एक त्रुटि कह प्राप्त -
no viable conversion from 'shared_ptr<class Derived1>' to 'shared_ptr<class Base>'
no viable conversion from 'shared_ptr<class Derived1>' to 'shared_ptr<class Base>'
क्या क्या मैं गलत कर रहा हूँ? क्या बेस बेस पर static_pointer_cast
का उपयोग करना सुरक्षित है? जैसा -
doSomething(static_pointer_cast<Base>(make_sahred<Derived2>()))
समाधान मेरे बुरा ... समस्या यह है कि मैं निजी तौर पर आधार वर्ग इनहेरिट किया गया था।
कौन सा संकलक इसका इस्तेमाल करता है? मुझे नवीनतम ऐप्पल क्लैंग पर त्रुटि मिलती है ... – subzero
क्षमा करें मेरी बुरा ... मैं अपने कोड में निजी रूप से कक्षा को विरासत में मिला था! वह वास्तव में एक गड़बड़ गलती थी! – subzero
क्या साझा_ptr स्वचालित रूप से (किसी भी प्रकार के कास्टिंग के बिना) बेस क्लास shared_ptr में परिवर्तित हो जाता है? क्या वे समान संदर्भ गिनती साझा करते हैं? – abhiarora