我正在开发一些容器类,它有类似的想法:将指针放在里面。
#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
- 如多态是否可实现?或者是这个功能,它在某种程度上是用C ++硬编码的?抱歉我的原始语言。
答案 0 :(得分:0)
实现以下构造函数:
template<class Other,
class = typename std::enable_if<std::is_convertible<Other*, T*>::value>::type>
Container(const Container<Other>& _Other)
{
pointer = _Other.pointer;
}
只有在Other*
可转换为T*
时才会启用此构造函数,如果T
是Other
的基类,则显然就是这种情况。