具有模板化类和动态调度的C ++ shared_pointer

时间:2019-02-17 19:28:09

标签: c++ inheritance polymorphism shared-ptr

我有一个C ++代码,尝试在派生类上创建shared_pointer。创建shared_pointer后,动态分派将停止工作。

我的代码:

#include <iostream>
#include <memory>

using namespace std;

template <typename T>
class Base
{
public:
    virtual void print()
    {
        cout << "Print from Base" << endl;
    }

};

template <typename T>
class Child : public Base<T>
{
public:
    virtual void print()
    {
        cout << "Print from Child" << endl;
    }
};

template <typename T>
class TestClass: public Base<T>
{
public:
    TestClass<T> (Base<T> &b)
    {
        b.print();
        shared_ptr<Base<T>> sptr = make_shared<Base<T>> (b);
        sptr->print();
    }
};

int main()
{
    Child<int> child;
    TestClass<int> cl(child);
}

TestClass的副本构造函数中,我首先调用print()方法,该方法很好用。创建shared_pointer后,该方法将引用基类。

输出如下:

Print from Child
Print from Base

问题:如何创建共享指针而不丢失动态调度功能?

1 个答案:

答案 0 :(得分:2)

make_shared不会共享现有内容;它会根据您提供的类型创建一个新的共享内容。

实际上就是这样(仅伪代码!):

template <typename T>
shared_ptr<T> make_shared(Args...)
{
    shared_ptr<T> newPtr = new T(args...);
    return newPtr;
}

在这种情况下,您正在创建一个Base<int>,它将被共享。它不是什么的孩子。这是您的Child<int>的切片副本。

TestClass中的所有内容都不知道您想要Child<int>,甚至不知道Child<int>作为一种类型存在。

您可以执行shared_ptr<Base<T>> sptr = &b来获取现有对象的shared_ptr。不幸的是,所说的对象不是动态分配的,所以运行得不好。

与对象所有权语义保持一致确实更好。您的main函数可以执行auto ptr = make_shared<Child<int>>(),然后将生成的共享指针传递给需要shared_ptr<Child<int>>shared_ptr<Base<int>>的任何对象。

在不知道您实际要做什么的情况下,我无法提出更具体的建议。