【发布时间】:2015-06-01 05:37:14
【问题描述】:
我正在开发一些容器类,它有类似的想法:在里面保存指针。
#include <iostream>
template<class T>
class Container
{
public:
Container ( )
{
pointer = new T ( );
}
~Container ( )
{
delete pointer;
}
T* operator->( )
{
return pointer;
}
private:
T* pointer;
};
struct Base
{
virtual void who ( )
{
std::cout << "Base" << std::endl;
}
};
struct Child : public Base
{
virtual void who ( ) override
{
std::cout << "Child" << std::endl;
}
};
void testContainer ( Container<Base> c )
{
c->who ( );
}
void testSharedPtr ( std::shared_ptr<Base> s )
{
s->who ( );
}
int main ( )
{
Container<Child> child;
std::shared_ptr<Child> sharedChild;
testSharedPtr ( sharedChild );
testContainer ( child );
}
此代码编译失败:error C2664: 'void test(Container<Base> &)' : cannot convert argument 1 from 'Container<Child>' to 'Container<Base> &'
但是使用std::shared_ptr<Base>,而不是Container,一切正常。所以问题是:std::shared_ptr-like 多态可以实现吗?还是这个功能,它以某种方式在 C++ 中硬编码?对不起我的原始语言。
【问题讨论】:
-
你看过
std::shared_ptr的界面,尤其是constructor overloads吗?那可能会回答你的问题。另请注意,即使使用std::shared_ptr,您的代码也不会编译,因为该函数采用非常量引用。 VS 有一个允许它的扩展,但通常临时(例如来自隐式转换的那些)不能绑定到非 const 左值引用。 -
我的错,已编辑!谢谢
-
不过,看看下面的答案,您的解决方案似乎不适用于我的情况。
标签: c++ c++11 std shared-ptr