C++ 将派生类shared_ptr作为参数传递给希望基类shared_ptr的函数

C++ 将派生类shared_ptr作为参数传递给希望基类shared_ptr的函数,c++,visual-c++,inheritance,shared-ptr,C++,Visual C++,Inheritance,Shared Ptr,我刚刚对一个项目进行了大规模的重构,添加了一个基类来代替现在所说的基类的派生类(因为我希望这个类有更多的“类型”) 我的问题是,一些实用程序函数将原始类a的引用作为共享的\u ptr,因此函数声明如下所示: void UtilityClass::func(shared_ptr<A> &a); void utilityplass::func(共享); 但是现在我有了新的基类B,A是从B派生的(以及从B派生的新类C),当我尝试将A或C的实例传递给现在声明为: void Uti

我刚刚对一个项目进行了大规模的重构,添加了一个基类来代替现在所说的基类的派生类(因为我希望这个类有更多的“类型”)

我的问题是,一些实用程序函数将原始类a的引用作为共享的\u ptr,因此函数声明如下所示:

void UtilityClass::func(shared_ptr<A> &a);
void utilityplass::func(共享);
但是现在我有了新的基类B,A是从B派生的(以及从B派生的新类C),当我尝试将A或C的实例传递给现在声明为:

void UtilityClass::func(shared_ptr<B> &b);
void utilityplass::func(共享);
如果我尝试通过:

shared_ptr<A> a;
utilclass.func(a);
shared\u ptr a;
实用类功能(a);
我得到一个编译时错误,它说(意译):

无法将参数1从“std::shared_ptr”转换为 'std::共享\u ptr'

但我不确定如何解决这个问题,func()将A、B或C实例添加到共享的_ptr值的std::vector中

谢谢你抽出时间

编辑:我还有另一个函数,它获取一个引用,这样它就可以给它分配一个新的B实例,然后返回它。

更改
共享\u ptr a
共享\u ptr a

您仍然可以为其分配更派生类型的指针,但可以通过基类实现多态性。

以下操作没有任何问题,并且是受支持的方案:

#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;
}
#包括
#包括
#包括
类Foo{};
类栏:公共Foo{};
int_tmain()
{
std::shared_ptr b(新条());

std::cout问题是您通过的是非
const
引用,这意味着您需要参数类型精确匹配

将函数更改为按值或引用获取指针;然后可以对参数应用隐式转换(例如
shared_ptr
shared_ptr

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>
}
A类{
公众:
虚拟~A(){};
虚拟空打印(){
出售(“A”);
}
};
B类:公共A{
公众:
作废打印(){
认沽权(“B印花”);
}
};
void func(标准::共享\u ptr a){
a->print();
}
int main()
{
std::shared_ptr b_1(新的b());//可以容纳b*
std::shared_ptr b_2(新b());
//两个next函数都调用print“B prints”
func(b_1);
func(b_2);//可以接受std::shared_ptr
}

如果我在某个时候将“新”共享\u ptr从向量中拉回来,我是否会将其动态\u抛回共享\u ptr以再次使用其功能?支持吗?为什么共享\u ptr已经存在?您可能做错了。我们可以将指针拉出来,并将其推到不同的共享指针中,然后执行各种操作f casts但是你的代码将成为一个危险的头痛问题。很抱歉刚刚编辑了我的评论,意识到它没有意义,但我现在意识到我留下的部分也没有意义:)非常感谢你的帮助-我想我现在明白了。