Std:: shared_ptr и Наследование

У меня возникают некоторые проблемы с автоматическим приведением типов 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 для типа Base? Как -

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

РЕШЕНИЕ Мой плохой... Проблема в том, что я наследовал базовый класс в частном порядке.

Ответ 1

Насколько я могу судить, код, который вы представили, компилируется отлично: 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>());
}