簡體   English   中英

std :: shared_ptr和繼承

[英]std::shared_ptr and Inheritance

我在繼承類的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>()))

解決方案我的不好......問題是我私下繼承了基類。

據我所知,您提供的代碼編譯得很好: 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>());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM