C++面向对象编程:虚函数与多态示例

需积分: 0 0 下载量 145 浏览量 更新于2024-08-19 收藏 1.21MB PPT 举报
在本篇C++课件中,讨论了面向对象编程(Object-Oriented Programming, OOP)在C++中的应用和实践,特别是关于"强制指向"(强制类型转换)的情况。强制指向允许在运行时确定对象的实际类型,并调用相应的方法,从而体现了多态性。例如,通过`fn(s)`和`fn(gs)`,我们看到一个基类`Student`和派生类`Master`的实例被传递给同一个函数,根据实际对象类型的不同,调用的是各自特有的`display()`方法。 课件重点介绍了类和对象的概念,以及如何在类中定义虚函数,如`void display()`,使得派生类可以重写基类的行为。这种灵活性使得面向对象设计具有复用性,不仅支持了面向对象语言的发展,还推动了软件工程实践。 C++作为一种面向对象语言,其特点包括: 1. 既高级又低级的语言特性:C++结合了C语言的底层控制和现代高级语言的抽象功能。 2. 数据类型的丰富和灵活:几乎无限制的数据类型构造能力,允许开发者创建复杂的数据结构。 3. 不拘泥于规则的语法:允许一定程度的自由度,适应各种编程风格。 4. 结构化的编程:通过函数作为基本程序单元,实现代码的组织和模块化。 此外,C++为了支持面向对象编程,引入了新的数据类型和语法,如虚函数、继承、组合等,以促进对象间的交互和重用。同时,尽管C++相较于C#和Java可能不够纯粹,但它的面向过程和面向对象特性在实际开发中会长期共存。 课程内容包括对C语言基础的回顾,深入讲解类、指针、数组操作等基础知识,以及面向对象编程的核心概念,如抽象、继承和组合。数组作为常见数据结构,其作为参数传递和访问的技巧也得到了详细讨论,包括指针的用法、数组下标运算符`[]`与指针运算符`*`的区别,以及避免数组越界访问的重要性。 在课程中,还强调了面向对象设计方法在解决过程语言不足方面的优势,并提及了面向对象与其他编程范式(如面向组件、面向方面和面向服务)之间的联系,以及这些技术在就业笔试和面试中的实际应用。此外,C++的特点和与其他语言的对比也被纳入课程内容,帮助学生理解C++的独特定位。

#include "def.h" #include "utils/maths.h" //用户注意;接口需要如下声明 extern "C"_declspec(dllexport) PlayerTask player_plan(const WorldModel* model, int robot_id); enum ball_near //PenaltyArea { outOfOrbit, onOrbit, shoot }; PlayerTask player_plan(const WorldModel* model, int robot_id){ PlayerTask task; const point2f& opp_goal = model->get_place_pos(); const float pi = 3.1415926; const float& circleR = 30; const float& DetAngle = 0.6; const point2f& goal = FieldPoint::Goal_Center_Point; const point2f& ball = model->get_ball_pos(); const point2f& kicker = model->get_our_player_pos(robot_id); const float& dir = model->get_our_player_dir(robot_id); ball_near orbit; point2f shootPosOnOrbit = ball + Maths::vector2polar(circleR, (ball - opp_goal).angle()); float toShootDir = fabs((kicker - ball).angle() - (ball - opp_goal).angle()); //(kicker - shootPosOnOrbit).length(); float toBallDist = (kicker - ball).length(); float toOppGoalDir = (opp_goal - kicker).angle(); float toBallDir = (ball - kicker).angle(); point2f robotBallAcrossCirclePoint = ball + Maths::vector2polar(circleR, (kicker - ball).angle()); point2f AntishootPosOnOrbit = ball + Maths::vector2polar(circleR, (opp_goal - ball).angle()); point2f BallToRobot = kicker - ball; if (toBallDist >circleR + 10) orbit = outOfOrbit; else if (toShootDir > 1) orbit = onOrbit; else orbit = shoot; bool getBall = toBallDist < 10; float diffdir_onorbit = 0; float b2r = BallToRobot.angle(); float o2b = (ball - opp_goal).angle(); bool add; switch (orbit) { case outOfOrbit: task.target_pos = robotBallAcrossCirclePoint; task.orientate = toOppGoalDir; break; case onOrbit: if (b2r * o2b >0){ if (b2r > 0){ if (b2r > o2b) add = false; else add = true; } else{ if (b2r > o2b) add = false; else add = true; } } else{ if (b2r > 0) add = true; else add = false; } if (add) { //+ task.target_pos = ball + Maths::vector2polar(circleR, BallToRobot.angle() + DetAngle); task.orientate = toOppGoalDir; } else { //- task.target_pos = ball + Maths::vector2polar(circleR, BallToRobot.angle() - DetAngle); task.orientate = toOppGoalDir; } break; case shoot: task.target_pos = ball + Maths::vector2polar(5, (ball - opp_goal).angle()); task.orientate = toOppGoalDir; task.needKick = true; task.flag = 1; if (toBallDist < 10 && fabs(model->get_our_player_dir(robot_id) - task.orientate) < 0.15){ task.kickPower = 60; } break;

2023-07-12 上传

const ServerParam & SP = ServerParam::i(); const int self_min = wm.interceptTable()->selfReachCycle(); const int mate_min = wm.interceptTable()->teammateReachCycle(); int opp_min = wm.interceptTable()->opponentReachCycle(); const PlayerObject * opp_fastest = wm.interceptTable()->fastestOpponent(); if ( opp_fastest && opp_fastest->goalie() && wm.gameMode().isPenaltyKickMode() && opp_fastest->pos().dist( wm.ball().pos() ) >= 3.0 ) // MAGIC NUMBER { M_tackle_situation = false; M_opponent_ball = false; dlog.addText( Logger::TEAM, __FILE__":(update) penalty shootouts. not a tackle situation" ); return; } if ( opp_fastest && wm.gameMode().isPenaltyKickMode() && ! opp_fastest->goalie() ) { const AbstractPlayerObject * opponent_goalie = wm.getTheirGoalie(); if ( opponent_goalie ) { /* //yz del std::map< const AbstractPlayerObject*, int >::const_iterator player_map_it = wm.interceptTable()->playerMap().find( opponent_goalie ); if ( player_map_it != wm.interceptTable()->playerMap().end() ) { // considering only opponent goalie in penalty-kick mode opp_min = player_map_it->second; dlog.addText( Logger::TEAM, __FILE__":(update) replaced min_opp with goalie's reach cycle (%d).", opp_min ); } else { opp_min = 1000000; // practically canceling the fastest non-goalie opponent player dlog.addText( Logger::TEAM, __FILE__":%d: (update) set opp_min as 1000000 so as not to consider the fastest opponent.", __LINE__ ); } */ } else { opp_min = 1000000; // practically canceling the fastest non-goalie opponent player dlog.addText( Logger::TEAM, __FILE__":%d (update) set opp_min as 1000000 so as not to consider the fastest opponent.", __LINE__); } }

2023-07-25 上传