在 C++ 中我们可以这样做:
struct Base
{
virtual Base* Clone() const { ... }
virtual ~Base(){}
};
struct Derived : Base
{
virtual Derived* Clone() const {...} //overrides Base::Clone
};
然而,以下代码无法实现相同的效果:
struct Base
{
virtual shared_ptr<Base> Clone() const { ... }
virtual ~Base(){}
};
struct Derived : Base
{
virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone
};
在这个例子中,Derived::Clone
隐藏了 Base::Clone
,而不是像覆盖一样重写它,因为标准规定重写的成员函数只能从返回基类的引用(或指针)变成返回派生类的引用(或指针)。有没有聪明的解决方法?当然可以说Clone
函数应该始终返回普通指针,但现在先忘记这个 - 这只是一个说明性的例子。我正在寻找一种方法,使虚函数的返回类型从智能指针指向Base
变成智能指针指向Derived
。
提前感谢!
更新:我的第二个例子确实无法编译,感谢Iammilind。
Clone()
也可能在非多态上下文中被调用,而在这种情况下不希望丢失类型信息。 - Karl Knechtel