この単純なプログラムを考えてみましょう。
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から派生している限り問題ありません。
同じように、変異関数のみを要求するインターフェースを満たす非変異関数を提供する実装ではありませんか?