にしたい場合は、パブリックに継承する必要がありますSquare
。 Rectangle
ただし、これは、 で機能するすべてのパブリック メソッドRectangle
が に適切に特化されている必要があることを意味しますSquare
。この文脈では
void makeBigger(Rectangle& r)
スタンドアロン関数ではなく、(独自のものを提供することによって) オーバーライドされるか 、 (セクションによって) 非表示になる仮想メンバーでRectangle
あってはなりません。Square
using makeBigger
private
Rectangle
でできることが でできないという問題についてSquare
。これは一般的な設計上のジレンマであり、C++ は設計に関するものではありません。誰かがRectangle
実際には であるへの参照 (またはポインタ) を持っSquare
ていて、 に対して意味のない操作を実行したい場合はSquare
、それに対処する必要があります。いくつかのオプションがあります:
1 公開継承を使用しSquare
、実行できない操作が試行された場合に例外をスローします。Square
struct Rectangle {
double width,height;
virtual void re_scale(double factor)
{ width*=factor; height*=factor; }
virtual void change_width(double new_width) // makes no sense for a square
{ width=new_width; }
virtual void change_height(double new_height) // makes no sense for a square
{ height=new_height; }
};
struct Square : Rectangle {
double side;
void re_scale(double factor)
{ side *= factor; } // fine
void change_width(double)
{ throw std::logic_error("cannot change width for Sqaure"); }
virtual void change_height(double)
{ throw std::logic_error("cannot change height for Sqaure"); }
};
change_width()
またはchange_height()
インターフェイスの不可欠な部分である場合、これは本当に扱いにくく、適切ではありません。このような場合は、次のことを考慮してください。
2 1 つclass Rectangle
(たまたま正方形である可能性があります) と、オプションで、に変換 ( )class Square
できる別のものを使用できます。したがって、長方形として機能しますが、のように変更することはできません。static_cast<Rectangle>(square)
Rectangle
Rectangle
struct Rectangle {
double width,height;
bool is_square() const
{ return width==height; }
Rectangle(double w, double h) : width(w), height(h) {}
};
// if you still want a separate class, you can have it but it's not a Rectangle
// though it can be made convertible to one
struct Square {
double size;
Square(Rectangle r) : size(r.width) // you may not want this throwing constructor
{ assert(r.is_square()); }
operator Rectangle() const // conversion to Rectangle
{ return Rectangle(size,size); }
};
Rectangle
に変更できるの場合、このオプションは正しい選択ですSquare
。つまり、コードに実装されているように(幅と高さを個別に変更可能) 、Square
が でない場合。 ただし、は に静的にキャストできるため、引数を取る関数は . で呼び出すこともできます。Rectangle
Square
Rectangle
Rectangle
Square