考虑这个简单的程序:
class Shape
{
public:
virtual double getArea() = 0;
};
class Rectangle : public Shape
{
int width;
int height;
public:
Rectangle( int w , int h ) :width(w) , height(h) {}
double getArea() const
{
return width * height;
}
};
int main() {
Rectangle* r = new Rectangle(4,2);
}
试图编译这个问题给了我:
'Rectangle' : cannot instantiate abstract class
当协变返回类型是时,为什么在 C++ 中不允许这样做?当然,我可以通过使其Rectangle::getArea
成为非常量函数来修复程序,但我很好奇为什么语言设计者会做出不同的决定。
编辑
很多人在他们的答案中提到了签名的不同之处。但也是如此
class Shape
{
public:
virtual BaseArea* getArea() = 0;
};
class Rectangle : public Shape
{
public:
virtual RectangleArea* getArea();
};
但是当 C# 不允许时,C++ 会竭尽全力允许它。
C++ 支持协变返回类型,因为如果我希望接口返回 aBaseArea*
并且实现返回 a RectangleArea*
,那么只要 RectangleArea 派生自 BaseArea 就可以,因为我的合同得到满足。
同样,提供非变异函数的实现不是满足只要求变异函数的接口吗?