2014-07-07 22 views
11

मुझे विरासत कक्षाओं के 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>())) 

समाधान मेरे बुरा ... समस्या यह है कि मैं निजी तौर पर आधार वर्ग इनहेरिट किया गया था।

उत्तर

5

जहां तक ​​मेरा बता सकते हैं, कोड है कि आप प्रस्तुत किया है ठीक संकलित: http://ideone.com/06RB2W

#include <memory> 

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

class Derived1: public Base { 
    public: 
     Derived1() = default; 
     virtual ~Derived1() = default; 
     void run() {} 
}; 

class Derived2: public Base { 
    public: 
     Derived2() = default; 
     virtual ~Derived2() = default; 
     void run() {} 
}; 

void doSomething(std::shared_ptr<Base> ptr) { 
    ptr->run(); 
} 

int main() { 
    doSomething(std::make_shared<Derived1>()); 
    doSomething(std::make_shared<Derived2>()); 
} 
+0

कौन सा संकलक इसका इस्तेमाल करता है? मुझे नवीनतम ऐप्पल क्लैंग पर त्रुटि मिलती है ... – subzero

+10

क्षमा करें मेरी बुरा ... मैं अपने कोड में निजी रूप से कक्षा को विरासत में मिला था! वह वास्तव में एक गड़बड़ गलती थी! – subzero

+1

क्या साझा_ptr स्वचालित रूप से (किसी भी प्रकार के कास्टिंग के बिना) बेस क्लास shared_ptr में परिवर्तित हो जाता है? क्या वे समान संदर्भ गिनती साझा करते हैं? – abhiarora

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