簡體   English   中英

將派生類shared_ptr作為參數傳遞給想要基類shared_ptr的函數

[英]pass derived class shared_ptr as parameter to function that wants base class shared_ptr

我只是通過對項目的大規模重構來添加基類,以代替現在所說的基類的派生類(因為我想要該類的更多“類型”)。

我的問題是,某些實用程序函數將原始類A的引用作為shared_ptr進行引用,因此函數聲明如下所示:

void UtilityClass::func(shared_ptr<A> &a);

但是,現在有了新的基類B,並且A派生自B(以及從B派生的新類C),我在嘗試傳遞A或C的實例時遇到了編譯時錯誤聲明為現在的函數:

void UtilityClass::func(shared_ptr<B> &b);

如果我嘗試通過:

shared_ptr<A> a;
utilclass.func(a);

我收到一個編譯時錯誤,說(釋義):

無法將參數1從'std :: shared_ptr <_Ty>'轉換為'std :: shared_ptr <_Ty>'

但是我不確定如何解決這個問題,func()將A,B或C實例添加到shared_ptr值的std :: vector中。

謝謝你的時間。

編輯:我也有另一個函數,它帶有引用,以便它可以為其分配一個新的B實例,然后將其返回。

問題是,你是通過非傳遞const引用,這意味着你需要的參數類型完全匹配。

更改函數以按值或const引用獲取指針; 然后可以將隱式轉換(例如shared_ptr<Derived>shared_ptr<Base> )應用於該參數。

以下工作正常,並且是受支持的方案:

#include <tchar.h>
#include <memory> 
#include <iostream>

class Foo { };

class Bar : public Foo { };

int _tmain() 
{
  std::shared_ptr<Bar> b(new Bar());

  std::cout << b.use_count() <<std::endl;

  std::shared_ptr<Foo> f(b);

  std::cout << b.use_count() <<std::endl;
  std::cout << f.use_count() <<std::endl;

  return 0;
}

如果派生了類,則不會出現任何問題。

更改shared_ptr<A> a; shared_ptr<B> a; 您仍然可以為它分配更多派生類型的指針,但是可以通過基類實現多態。

這有效:

class A {
public:
    virtual ~A() {};
    virtual void print() {
        puts("A prints");
    }
};
class B: public A {
public:
    void print() {
        puts("B prints");
    }
};


void func(std::shared_ptr<A> a) {
    a->print();
}


int main()
{
    std::shared_ptr<A> b_1(new B()); // can hold B*
    std::shared_ptr<B> b_2(new B());

    // both next function calls print "B prints"
    func(b_1);
    func(b_2); // can accept std::shared_ptr<B>
}

暫無
暫無

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

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