C++多重继承与面向对象基础讲解

需积分: 0 0 下载量 8 浏览量 更新于2024-08-19 收藏 1.21MB PPT 举报
多重继承是C++面向对象编程(OOP)中的一个特性,它允许一个派生类同时从两个或更多的基类继承属性和行为。在提供的代码示例中,有两个基础类Master和Phd,它们分别有id和pratice(字符串类型)以及id和paper(字符串类型)成员变量。M_p类通过public关键字同时继承了Master和Phd,创建了一个新的类,同时拥有这两个基类的所有公共成员。 M_p类的构造函数采用参数列表,接收两个字符串参数,并通过Master和Phd的构造函数初始化相应的实例变量。在这个例子中,M_p类还添加了一个float类型的avg成员变量,用于计算平均值。 主函数中创建了一个M_p类型的对象a,传入了"C++"和"KDD"作为字符串参数,设置了其avg属性为85.9,并输出了practise和paper的值。注意,虽然类M_p可以直接访问Master和Phd的成员,但在C++中,如果想要访问基类的私有或保护成员,通常需要通过基类的引用或者指针来间接访问。 在课程介绍部分,提到面向对象程序设计(OOP)是解决过程语言不足的一种设计方法,它的优势在于复用和模块化。C++作为一种支持面向对象的语言,不仅丰富了数据类型和语法,以适应面向对象的需求,还引入了类的概念,包括类的定义、继承、组合等概念,这些都是实现面向对象编程的核心要素。 课程重点强调面向对象的设计,包括面向对象、面向组件、面向方面和面向服务等多种设计模式,这些在实际项目开发中都是非常重要的技能。同时,课程也提到了C++与C以及其他面向对象语言(如C#和Java)的区别,指出C++在面向对象方面的改进和面向过程的兼容性。 此外,课程内容还包括C语言的基础回顾,以及指针的相关知识,如指针的声明、操作数组、数组作为参数传递以及可能遇到的越界问题。这些基础知识对于理解和使用C++来说至关重要。 多重继承是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 上传