[英]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.