将派生类shared_ptr作为参数传递给需要基类shared_ptr的函数

时间:2013-08-01 10:59:04

标签: c++ visual-c++ inheritance 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);

我得到一个编译时错误说(释义):

  

无法从'std :: shared_ptr&lt; _Ty&gt;'转换参数1至   'STD :: shared_ptr的&LT; _Ty&GT;'

但是我不确定我是怎么解决这个问题的,func()会将A,B或C实例添加到shared_ptr值的std :: vector中。

感谢您的时间。

编辑:我还有另一个函数,它接受一个引用,以便它可以为它分配一个新的B实例,然后返回它。

4 个答案:

答案 0 :(得分:5)

问题是你传递的是非const引用,这意味着你需要参数类型完全匹配。

更改函数以按值或const引用获取指针;然后隐式转换(例如shared_ptr<Derived>shared_ptr<Base>)可以应用于参数。

答案 1 :(得分:2)

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

#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;
}

如果派生了类,则不会出现任何问题。

答案 2 :(得分:1)

shared_ptr<A> a;更改为shared_ptr<B> a; 您仍然可以为其指定更多派生类型的指针,但通过基类实现多态性。

答案 3 :(得分:0)

这有效:

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>
}