親classのpointerに子の所有権を持たせない。
子固有の操作がしたいなら、子の集合を別途管理しとけばいい。

std::list< Line > lines;
std::list< Ellipse > ellipses;
std::list< Paintable* > figures;

lines.push_back( Line() );
figures.push_back( &lines.back() );

ellipses.push_back( Ellipses() );
figures.push_back( &ellipse.back() );