std :: shared_ptr和继承

ssb*_*ssb 14 c++ inheritance boost shared-ptr c++11

我在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() {...}
  ...
  ...
};
Run Code Online (Sandbox Code Playgroud)

我有一个功能 doSomething()

void doSomething(std::shared_ptr<Base> ptr) {
  ptr->run();
  ...
}
Run Code Online (Sandbox Code Playgroud)

我用这样的派生类调用函数 -

doSomething(make_shared<Derived1>())
doSomething(make_shared<Derived2>())
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误说 -

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>'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?使用static_pointer_castBase类型是否安全?喜欢 -

doSomething(static_pointer_cast<Base>(make_sahred<Derived2>()))
Run Code Online (Sandbox Code Playgroud)

解决方案 我的不好......问题是我私下继承了基类.

Bil*_*nch 7

据我所知,您提供的代码编译得很好: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>());
}
Run Code Online (Sandbox Code Playgroud)

  • 对不起我的坏...我在我的代码中私下继承了这个类!那是一个真正的新手错误! (11认同)
  • Shared_ptr 是否自动(无需任何类型转换)转换为基类shared_ptr?他们共享相同的引用计数吗? (2认同)