我有一个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
问题:如何创建共享指针而不丢失动态调度功能?
答案 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>>
的任何对象。
在不知道您实际要做什么的情况下,我无法提出更具体的建议。