我见过的协变返回类型最常见的用法是通过虚函数。我能想到的最简单的例子看起来像这样:
class Base {
public:
virtual Base& get() { return *this; }
};
class Derived : public Base {
public:
Derived& get() override { return *this; }
};
有一件事我真的不明白,为什么要把这些功能虚拟化。get
函数的返回类型是在调用点静态定义的,即使*this
可以向下转换为Derived
,我们也无法通过调用Base::get
来获得Derived&
。这一切都意味着多态性无论如何都不适用于返回类型。对我来说,让这些函数成为非虚函数,让基方法由子方法重新定义,看起来更合理一些。但人们还是喜欢把它们虚拟化,至少我注意到了。对此有什么解释吗?
1条答案
按热度按时间ljsrvy3e1#
使用更有用的示例
clone
:现在随着
一切都很好。按照您的建议删除virtual会改变行为,并无条件地打印Base。
现在,一个协变返回类型有用的情况: