2014-07-07 10 views
11

Ho problemi con il typecasting automatico tra shared_ptr di classi ereditate.std :: shared_ptr ed Eredità

mia struttura di classe è come segue, una classe base Base e due classi derivate Derived1 e 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() {...} 
    ... 
    ... 
}; 

Ho una funzione doSomething()

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

io chiamo la funzione con le classi derivate in questo modo -

doSomething(make_shared<Derived1>()) 
doSomething(make_shared<Derived2>()) 

Ma ottengo un errore che dice -

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>' 

Cosa sto sbagliando? È sicuro usare solo static_pointer_cast per il tipo Base? Come -

doSomething(static_pointer_cast<Base>(make_sahred<Derived2>())) 

SOLUZIONE Il mio male ... Il problema era che stavo ereditare la classe base privata.

risposta

5

Per quanto posso dire, il codice che avete presentato compila bene: 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

quale compilatore usa? Ottengo l'errore sull'ultimo Apple Clang ... – subzero

+10

Scusa il mio male ... Ho ereditato la classe privatamente nel mio codice! E 'stato un vero errore da principiante! – subzero

+1

Does shared_ptr automaticamente (senza alcun cast di tipi) viene convertito in una classe base shared_ptr? Condividono lo stesso conteggio dei riferimenti? – abhiarora