2014-07-07 7 views
11

Ich habe einige Probleme mit der automatischen Typumwandlung zwischen shared_ptr der geerbten Klassen.Std :: shared_ptr und Vererbung

Meine Klassenstruktur ist wie folgt, eine Basisklasse Base und zwei abgeleitete Klassen Derived1 und 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() {...} 
    ... 
    ... 
}; 

Ich habe eine Funktion doSomething()

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

ich die Funktion mit den abgeleiteten Klassen wie so nennen -

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

Aber ich erhalte eine Fehlermeldung, -

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

Was? mache ich falsch? Ist es sicher, nur static_pointer_cast zum Basistyp zu verwenden? Wie -

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

SOLUTION Mein schlechtes ... Das Problem war, dass ich die Basisklasse privat wurde vererben.

Antwort

5

Soweit ich das beurteilen kann, der Code, der Ihnen präsentiert habe kompiliert fein: 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

Welche Compiler ist es zu verwenden? Ich bekomme den Fehler auf dem neuesten Apple Clang ... – subzero

+10

Sorry mein Schlechter ... Ich erbte die Klasse privat in meinem Code! Das war ein richtiger Anfängerfehler! – subzero

+1

Wird shared_ptr automatisch (ohne Typ-Casting) in die Basisklasse shared_ptr konvertiert? Teilen sie die gleiche Referenzzahl? – abhiarora