C++多态
静态多态
静态多态通过重载实现多态
重载函数
函数同名,参数不同类型
123456void Func1(int a) { cout << "This is Func1(int), Parameter = "<< a << endl;}void Func1(float a) { cout << "This is Func1(float), Parameter = " << a << endl;}
重载运算符
123friend ostream& operator << (ostream o,const A& a) { return o<<a.a;}
动态多态
动态多态通过虚函数实现多态。使用动态多态必须通过指针或引用才能调用函数。
虚函数
虚函数的声明和调用
12345678910111213141516171819202122232425262728293 ...
C++继承
继承
访问属性
私有 private
仅能在类内访问,不可继承,子类不可访问。
保护 protected
仅能在类内访问,可继承,子类可访问。
公有 public
可在类内或类外访问,可继承,子类可访问。
继承方式
私有继承 private
父类中的public、protected成员以private属性继承至子类中。(访问权限降为private)
保护继承 protected
父类中的public、protected成员以protected属性继承至子类中。(访问权限降为protected)
公有继承 public
父类中的public、protected成员以原有属性继承至子类中。(保持原有访问权限)
类型转换
一个公有派生类的对象在使用上可以被当作基类的对象,反之则不可。
具体表现在:
派生类的对象可以隐含转换为基类对象。
派生类的对象可以初始化基类的引用。
派生类的指针可以隐含转换为基类的指针。
通过基类对象名、指针只能使用从基类继承的成员,派生类新增的成员不能使用。
构造函数与析构函数
构造函数在创建该类对象时调用。必须使用new、malloc等创建该类对象的指针或引用 ...
C++封装
类
类的成员
一个类包含:
变量
函数
构造函数
析构函数
内联成员函数 inline
使用inline关键字将函数声明为内联函数。
作用: 在编译阶段内联函数会将函数体替换到函数调用处,也就是说内联函数省去了调用函数时的压栈出栈过程。
声明方法:
类内声明 直接在类内声明函数体会将函数隐式的声明为内联函数。
1234567class A{public: //隐式地声明为内联函数 void func(){ std::cout<<"Call Function"<<std::endl; }}
类外声明 类外声明的函数使用inline关键字将函数声明为内联函数。
12345678class A{public: void func();}//显式地声明为内联函数inline void A::func(){ std::cout<<"Call Function"<<std::endl;& ...
C++面向对象编程OOP
面向对象的三个特点
面向对象编程将世间万物抽象出概念,具有封装、继承、多态的特点。
(其实个人感觉,面向对象与黑格尔的哲学思想很接近,不知道提出面向对象编程思想的老先生是不是收到了黑格尔的影响)
抽象
将一类对象的共同属性、行为、功能进行概括,总结成类。
封装
将抽象的数据、代码进行打包管理,放置于类中,提供合理的访问接口。
继承
在已有类的基础上进行对属性、行为、功能描述的拓展。
C++继承
多态
名称相同但实现不同功能的方式。
分为静态多态和动态多态两种,静态多态通过重载函数和泛型编程实现,动态多态通过虚函数实现。
C++多态
Unity_DerekBehaviourTrees
前言
**有限状态机(Finite State Mechine,FSM)与行为树(Behaviour Trees)**是常见的两种控制游戏角色行为逻辑的方式。
FSM将走、跑、跳、攻击、受击等状态不假区分的放到一起并进行逻辑连接,实践中需要我们维护一个当前状态,并时刻更新该状态的逻辑。对于简单的少数的状态,FSM是适用的。但如果状态间的切换逻辑复杂,FSM就会变为“蜘蛛网”,难以维护。
下面是我实现的FSM(“没写博客呢,正在施工中。。。”);
对于复杂的行为,最好使用行为树。行为树正如其名,它会向层次遍历树一样从根节点开始依次判断每个节点是否符合要求,对于符合要求的节点,我们会执行这一节点下的行动节点。
下面参考文章:“游戏AI行为决策方法——行为树”,实现自己的行为树组件(没有全抄)。
行为树(Behaviour Trees)
如上图所示,一棵行为树包含根节点、动作选择节点(组合节点)、动作节点、修饰节点这几部分。
理解行为树
动作节点
动作节点记录简单的基础行为,支持自定义。
修饰节点
特殊的节点,只包含一个子节点。
有两种修饰节点:
取反节点 Inverter
重复执行节点 ...
C++中的智能指针
书接上文!
C++中的指针
内存泄露问题
1234567891011121314151617181920class MyObject{public: MyObject() { cout<<"Create MyObject Object"<<'\n'; } ~MyObject() { cout<<"Delete MyObject Object"<<'\n'; }};int main(){ MyObject* obj = new MyObject(); //delete obj; return 0;}
输出:
1Create MyObject Object
智能指针
智能指针帮助我们自动释放不再使用的内存,从而避免内存泄漏问题。
C++98中加入了auto_ptr
C++11中auto_ptr更新为u ...
C++中的指针
什么是指针
指针表示存储某一对象(通常是变量、函数等)的内存地址。
普通指针
指针与变量
符号&表示引用,变量名左侧的&表示取该变量的地址。
符号表示解引用,变量名左侧的表示取该变量的值。
声明一个变量在类型名右侧用*表示声明该类型的指针。
1234567891011121314151617181920212223int main(int argc, char* argv[]){ std::cout<<"---------指针---------"<< '\n'; int *pc, c; c = 5; cout << "Address of c (&c): " << &c << endl; cout << "Value of c (c): " << c << endl << endl; pc = &c; ...
