クラス 図形 { 仮想 描画する(描画先) };

クラス 直線 : 図形
{
開始点,終了点
上書 描画する(描画先)
};

クラス 円   : 図形
{
中心点,長辺半径、短辺半径
上書 描画する(描画先)
};

クラス 円弧   : 図形
{
中心点,長辺半径、短辺半径、開始角度、終了角度
上書 描画する(描画先)
};

こんな感じにして、図形の管理はベクタ<図形へのポインタ> 図形達で管理しています。

このベクタのある要素の開始点、終了点を変更しようとすると

直線へのポインタ あ = 動的キャスト<直線へのポインタ>(図形達[n]);

あ が NULLじゃなかったら
あ->開始点.X = 1;

となりいちいち、キャストしなきゃいけない

これってどうですか?