рдирдорд╕реНрддреЗ, рдкреНрд░рд┐рдп рд╣рднреНрд░рд╡рдЪрди!
рдореИрдВ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдФрд░ рдЙрд╕рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрд╢реЛрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ upcast рд╡рд┐рдЬрд┐рдЯрд░ рдХрд╣рд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рд╕рд░рд▓ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдореИрдВ рдпрдерд╛рд╕рдВрднрд╡ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдХреЛрдб рдЙрджрд╛рд╣рд░рдг C ++ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд┐рдирд╛, рд▓реЗрдЦ рдХреЗ рд╕рд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ 2D рдЧреЗрдо рдбрд┐рдЬрд╛рдЗрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдлрд▓ рдПрдХ рдкреЗрдбрд╝ рд╕реЗ рдЧрд┐рд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдорд╛рд░рддреЗ рд╣реИрдВред рдЦреЗрд▓ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЯреЛрдХрд░реА рдХреЛ рдкреЗрдбрд╝ рдХреЗ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рдХрд░ рд╕рднреА рдлрд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╣реИред
рд╣рдо рдирд┐рдореНрди рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рдмрдирд╛рддреЗ рд╣реИрдВ:
рдУрдУрдкреА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдЖрднрд╛рд╕реА рдбреНрд░рд╛рдЗрдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рднреА рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ (рдлрд▓реЛрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕реЗрдм рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
void Apple::draw() { Graphics& graphics = GetGraphicsFromSomeMagicalPlace(); Texture& texture = GetAppleTextureFromEvenMoreMagicalPlace(); graphics.draw(texture, x(), y(), angle()); }
рд╣рдорд╛рд░реА рдореБрдЦреНрдп рдбреНрд░рд╛рдЗрдВрдЧ рд╡рд┐рдзрд┐, рдЬрд┐рд╕реЗ рдЧреЗрдо рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:
void Game::draw(std::vector<Object*>& allObjects) { std::vector<Object*>::iterator it = allObjects.begin(); std::vector<Object*>::iterator end = allObjects.end(); while(it != end) { (*it)->draw(); ++it; } }
Wuhu! рдмрд╣реБрд░реВрдкрддрд╛ рд╢рд╛рдВрдд рд╣реИ, рд╣рдо рд╕реЛрдЪрддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрд▓ рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдЪрд┐рддреНрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо
Box2D рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВред рдЖрд░реЗрдЦ рдореЗрдВ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЛ Box2D рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреНрд░реА рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рд╕реНрд╡рдпрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдлрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдПрдХ рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдХреНрд▓рд╛рд╕ Box2DObject рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдорд╛рд░рд╛ рдЖрд░реЗрдЦ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдХреЗрд╡рд▓ рдЖрд░реЗрдЦ рдХрд╛ рдКрдкрд░реА рднрд╛рдЧ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ):
B2Body рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣реЛрдЧрд╛, рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдВрдЪ рдХреНрд▓рд╛рд╕ рд▓реЗрдВ:
Branch::Branch() { b2BodyDef bodyDef; bodyDef.type = b2_staticBody; b2Body* body = GetBox2DWorldFromSomewhrere().CreateBody(&bodyDef); b2PolygonShape shape; shape.SetAsBox(BRANCH_WIDTH, BRANCH_HEIGHT); b2FixtureDef fixtureDef; fixtureDef.shape = &shape; fixtureDef.friction = BRANCH_FRICTION; fixtureDef.restitution = BRANCH_RESTITUTION; body->CreateFixture(&fixtureDef); m_box2dBody = body; body->SetUserData(this); } Branch::~Branch() { GetBox2DWorldFromSomewhrere().DestroyBody(m_box2dBody); }
рдлрд┐рд░ рд╕реЗ рдХреВрд▓, рд╣рдо рд╕реЛрдЪрддреЗ рд╣реИрдВред рдпрджреНрдпрдкрд┐ "рдЖрднрд╛рд╕реАрддрд╛" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдХреЛрдИ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ Box2D рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
рд╣рдо рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдЯрд╛рдП рдЧрдП рдХреЛрдб рд╕рднреА Box2DObject-рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ Box2DObject рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред рдЗрд╕ рддрд░рд╣:
Box2DObject::~Box2DObject() { GetBox2DWorldFromSomewhrere().DestroyBody(m_box2dBody); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд╛рд░рдВрдЧреА рдФрд░ рдПрдХ рд╕реЗрдм рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдлреНрд░реВрдЯ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
Fruit::Fruit() { b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; b2CircleShape shape; shape.m_radius = FRUIT_RADIUS; b2Body* body = GetBox2DWorldFromSomewhrere().CreateBody(&bodyDef); b2FixtureDef fixtureDef; fixtureDef.shape = &shape; fixtureDef.density = FRUIT_DENSITY; fixtureDef.friction = FRUIT_FRICTION; fixtureDef.restitution = FRUIT_RESTITUTION; body->CreateFixture(&fixtureDef); m_box2DBody = body; body->SetUserData(this); }
рдареАрдХ рд╣реИ, рдЕрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:
- рдмреЙрдХреНрд╕ 2 рдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдбреНрд░рд╛рдЗрдВрдЧ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ рд╣реИред
- рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ Box2D рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рдШрд╕реАрдЯрд╛" рдФрд░ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)?
- рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдХреЛрдб рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдВрдХрд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рдмреЙрдХреНрд╕ 2 рдбреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдкреАрдкреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
- рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдЧрдВрддреБрдХ рдкреИрдЯрд░реНрди
рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВ?
рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдпрджрд┐ рдЖрдк рдЙрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдФрд░ рдмреЙрдХреНрд╕ 2 рдбреА рдХреЗ рд▓рд┐рдП рдЖрдЧрдВрддреБрдХ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЕрдм рдЖрдк рд╕рдм рдХреБрдЫ рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдкреИрдЯрд░реНрди рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рд╣рдореЗрдВ рдЪрд╛рд░ рдирдП рд╡рд░реНрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рдЖрдЧрдВрддреБрдХ, рдкреЗрдВрдЯрд░, рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдирд╛рд╢рдХ:
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА рддрд░реАрдХреЗ рдкреЗрдВрдЯрд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдмреЙрдХреНрд╕ 2 рдбреА рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЖрднрд╛рд╕реА рд╕реНрд╡реАрдХрд╛рд░ рдкрджреНрдзрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рднреА рдкрддреНрддреЛрдВ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
class Object { public: virtual void accept(Visitor& visitor) = 0;
рдЗрд╕рдХреЗ рдмрд╛рдж рдкрджрд╛рдиреБрдХреНрд░рдо рдЗрд╕ рддрд░рд╣ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
рд╕реНрд╡реАрдХрд╛рд░ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рднреА рдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрддреА рд╣реИред
class Tree : public Object { public: virtual void accept(Visitor& visitor) { visitor.visit(*this);
рдЬрдм рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдЖ, рддреЛ рдХреЛрдб рдХреА рдЗрд╕ рдкрдВрдХреНрддрд┐ рдиреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдХреБрдЫ рднреА рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ред рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдмрд╛рдж рдореИрдВрдиреЗ
рдЪрд╛рд░ рдХреЗ рдЧрд┐рд░реЛрд╣ рдХреА рдкреБрд╕реНрддрдХ рд▓реА рдФрд░ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдбреАрдлрд╝реНрд░реЙрдиреНрдлреНрд░реЗрдВрд╕ рдХрд░рддреЗ рд╕рдордп, рдЖрд╡рд╢реНрдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ)ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм рдЗрд╕ рд░реЗрдЦрд╛ рдХреЛ рдЯреНрд░реА рдХреНрд▓рд╛рд╕ рд╕реЗ рдкреБрдХрд╛рд░рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢реВрдиреНрдп рдпрд╛рддреНрд░рд╛ (рдЯреНрд░реА рдПрдВрдб рдЯреНрд░реА) рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдм рдЗрд╕реЗ рдмрд╛рд╕реНрдХреЗрдЯ рдХреНрд▓рд╛рд╕ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢реВрдиреНрдп рдпрд╛рддреНрд░рд╛ (рдмрд╛рд╕реНрдХреЗрдЯ рдПрдВрдб рдмрд╛рд╕реНрдХреЗрдЯ) рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рддрд╛ рдЖрдЧрдВрддреБрдХ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рд▓реЗрдВ:
void Painter::visit(Apple& apple) { m_graphics.draw(m_appleTexture, apple.x(), apple.y(), apple.angle()); } void Painter::visit(Tree& tree) { m_graphics.draw(m_treeTexture, tree.x(), tree.y()); }
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдПрдХ рд╕реЗрдм рдпрд╛ рдПрдХ рдкреЗрдбрд╝ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд░реНрдЧ рдореЗрдВ рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрдд:
void Creator::visit(Basket& basket) {
рд╣рдорд╛рд░реА рд╕рд╛рдорд╛рдиреНрдп рдбреНрд░рд╛рдЗрдВрдЧ рд╡рд┐рдзрд┐, рдЬрд┐рд╕реЗ рдЧреЗрдо рд▓реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрди рдЬрд╛рдПрдЧреА:
void Game::draw(std::vector<Object*>& allObjects) { Painter& painter = GetPainter(); std::vector<Object*>::iterator it = allObjects.begin(); std::vector<Object*>::iterator end = allObjects.end(); while(it != end) { (*it)->accept(painter); ++it; } }
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛рддреЗ рд╕рдордп, рд╡рд┐рдирд╛рд╢рдХред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреЛрдб рдбрд╛рд▓рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЙрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдереАрдВред рдЕрдм:
- рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рд╣реИред рдЕрдиреНрдп рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ Box2D рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИред
- рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ Box2D рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рдкреЗрдВрдЯрд░, рдХреНрд░рд┐рдПрдЯрд░ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░реЙрдпрд░ рдХреНрд▓рд╛рд╕реЗрдЬ рд╕реЗ рд╣реА рдЪрд╛рд╣рд┐рдПред
- рдХреЛрдб рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ Box2D рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдХреЗрд╡рд▓ рдкреЗрдВрдЯрд░.рдХреИрдк, рдХреНрд░рд┐рдПрдЯрд░ .pp рдФрд░ рдирд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ .pp рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
- рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрджрд╛рдиреБрдХреНрд░рдо рд╡рд░реНрдЧ рд╕рдорд╛рди рд░рд╣рддреЗ рд╣реИрдВред
UpcastVisitor рдЗрдВрдЯрд░рд▓реЗрдпрд░
рдпрд╣рд╛рдВ рд╣рдо рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рджреЗрдЦ рдХрд░ рднрдпрднреАрдд рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╡рд░реНрдЧ рдореЗрдВ, рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрдм рдФрд░ рдирд╛рд░рдВрдЧреА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
void Destroyer::visit(Apple& apple) { m_box2dWorld.DestroyBody(apple.b2Body()); } void Destroyer::visit(Orange& orange) { m_box2dWorld.DestroyBody(orange.b2Body()); }
Box2DObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╕рднреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд visitBox2DObject рдкрджреНрдзрддрд┐ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
void Destroyer::visitBox2DObject(Box2DObject& object) { m_box2dWorld.DestroyBody(object.b2Body()); } void Destroyer::visit(Apple& apple) { visitBox2DObject(apple); } void Destroyer::visit(Orange& orange) { visitBox2DObject(orange); }
рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдбрд┐рд╕реНрдЯреНрд░реЙрдпрд░ рд╡рд░реНрдЧ рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рдмрдЬрд╛рдп рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рдХреЛрдб рд╣реЛ, "рд╕рд╣реА" рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - Box2DObjectред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдРрдкреНрдкрд▓, рдСрд░реЗрдВрдЬ, рдмрд╛рд╕реНрдХреЗрдЯ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
class Destroyer : public Visitor { public: void visit(Box2DObject& object) { m_box2dWorld.DestroyBody(object.b2Body()); }
рдПрдХ рдореМрдХрд╛ рд▓реЗрдВ рдФрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
class Visitor { public: void visit(Box2DObject& object);
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ Box2DObject рд╡рд░реНрдЧ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдкрджреНрдзрддрд┐ рдХрд╛ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдерд╛, рддреЛ рдЗрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╣реА рд╣реЛрдЧрд╛ - Box2DObject рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдпрд╛рддреНрд░рд╛ рд╡рд┐рдзрд┐ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд┐рд░ рдореИрдВ рдмреЗрд╕ рд╡рд┐рдЬрд┐рдЯрд░ рдХреНрд▓рд╛рд╕ рдФрд░ рдХреНрд░рд┐рдПрдЯрд░ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░реЙрдпрд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рд▓реЗрдпрд░ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдпрд░ рдХреЛ UpcastVisitor рдХрд╣рд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:
рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХреЛрдб рд╣реИ:
void UpcastVisitor::visit(Object& object) { } void UpcastVisitor::visit(Box2DObject& object) { visit(static_cast<Object&>(object)); } void UpcastVisitor::visit(Fruit& fruit) { visit(static_cast<Box2DObject&>(fruit)); } void UpcastVisitor::visit(Apple& apple) { visit(static_cast<Fruit&>(apple)); } void UpcastVisitor::visit(Orange& orange) { visit(static_cast<Fruit&>(orange)); }
рдпрджрд┐ Apple рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ UpcastVisitor рдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдлрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ Box2DObject рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВред рдЗрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░, UpcastVisitor'e рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ рд╡рд░реНрдЧ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдПрдХ рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ UpcastVisitor рд╕реЗ рд╡рд┐рдирд╛рд╢рдХ рд╡рд░реНрдЧ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдФрд░ рдЖрдирдиреНрджрд┐рдд рд╣реБрдП! рдпрджрд┐ UpcastVisitor рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
class Destroyer : public UpcastVisitor { public: virtual void visit(Box2DObject& object) { m_box2dWorld.DestroyBody(object.b2Body()); }
UpcastVisitor рдЖрдкрдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдПрдЯрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Box2D рдПрдВрдЯрд┐рдЯреА рдХреНрд░рд┐рдПрд╢рди рдХреЛрдб рдРрдкреНрдкрд▓ рдФрд░ рдСрд░реЗрдВрдЬ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ:
class Creator : public UpcastVisitor { public: virtual void visit(Fruit& fruit) {
рдареАрдХред рдпрд╣ рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдЫреЛрдЯреА рдЦрд╛рдореА рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ UpcastVisitor рд╡рд░реНрдЧ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬреЛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЦрд╛рдорд┐рдпреЛрдВ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХреЗрд╡рд▓ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реИ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ UpcastVisitor рдХреНрд▓рд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдмреЗрд╕ рд╡рд┐рдЬрд┐рдЯрд░ рд╡рд░реНрдЧ рдореЗрдВ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдирдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ UpcastVisitor рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдЕрджреНрдпрддрди рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЦреИрд░, рдЬрд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрд╕рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛!
рдЕрдкрдбреЗрдЯ :
7vies рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ UpcastVisitor рдореЗрдВ рдЖрдк static_cast рд╕реЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
void UpcastVisitor::visit(Box2DObject& object) { Object& o = object; visit(o); }
рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!