【问题标题】:std::shared_ptr and Inheritancestd::shared_ptr 和继承
【发布时间】:2014-08-27 12:07:54
【问题描述】:

在继承类的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 用于 Base 类型是否安全?喜欢-

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

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

【问题讨论】:

    标签: c++ inheritance c++11 boost shared-ptr


    【解决方案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>());
    }
    

    【讨论】:

    • 对不起我的错...我在我的代码中私下继承了这个类!这真是一个菜鸟的错误!
    • shared_ptr 是否自动(没有任何类型转换)转换为基类 shared_ptr?它们是否共享相同的引用计数?
    • 它不会自动类型转换,但是如果你手动转换它,那么引用计数是共享的。
    • 在您的代码中您没有手动键入 cast,所以他们共享引用计数吗?
    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 2012-05-13
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多