2014-07-07 3 views
11

shared_ptr 상속 된 클래스 간의 자동 typecasting에 몇 가지 문제가 있습니다.std :: shared_ptr 및 상속

내 클래스 구조는 다음과 같습니다. 기본 클래스 Base 및 두 개의 파생 클래스 Derived1Derived2입니다.

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

그것은 어떤 컴파일러를 사용합니까? 최신 Apple Clang에서 오류가 발생했습니다. – subzero

+10

죄송합니다 ... 내 코드에서 클래스를 개인적으로 상속했습니다! 그것은 정말 신인 선수의 실수였습니다! – subzero

+1

shared_ptr은 자동으로 (타입 변환없이) 기본 클래스 shared_ptr로 변환됩니까? 동일한 참조 횟수를 공유합니까? – abhiarora

관련 문제