33_抽象类多重继承

作业讲解 基类虚表是静态数据成员数组,基类里面存放函数,基类有一个数据成员虚表指针,基类析构的时候基类需要恢复虚表。派生类也有数据成员虚表指针,指向派生类的函数 抽象类 定义 一个类至少一个纯虚函数,这个类就是抽象类 抽象类调用抽象类会使程序退出。实验:可以抽象类指针指向派生类,先析构派生类,还原了虚函数指针,然后调用抽象类的虚函数 命名规范:抽象类用I开头,正常的类是C开头. 抽象类的虚函数->基类可以实现 纯析构函数,派生类必须实现析构 抽象类析构可以写成 virtual ~IAnimal() {}; //派生类会自动 ......

32_继承二与虚函数

继承权限 Class A : private B B里面的属性在A里面全部变成私有 Class A : protected B B里面的属性在A里面,public变成Protected,protected不变,private不变 Class A : public B A里面什么属性是什么B里面就是什么属性 运用场景 Claas A : private B,一般会选择想要公开的几个 函数 A::fun; 内存布局 A::member B::member 构造顺序 实例化对象的时候先构造基类,再构造子类,按继承顺序来构造基类 有对象成员的时候,先基类,再对象成员,再自己 析构顺序 先自己,在对象成员,在父类 父类指针指向子类对象 派生类指针转换 ......

31_继承

作用:解决类代码重用性 抽象:共同的属性抽象出来 关键字:类名 : 继承的父类,逗号分隔多个 子类也叫派生类,父类也叫基类 初始化列表,指定基类的构造函数 权限关键字 Protected,派生类继承了可以使用 重写基类的方法 1.作用,基类的方法被隐藏 2.使用,觉得基类的方法不能满足当前需求,写和基类一样的函数名,参数,重新实现 3.注意,继承的基类方法不构成重载,原因是作用域不一样 作业 1.以点类Point为基类,定义派生类三维点类,其中动物有属性x,y,三维点类新增加y属性, 编程实现属性和相关方法 //Point.h #pragma onc ......

27_构造函数与析构函数

面向对象编程的缺陷 数据成员是私有的,成员函数是共享的 类实例化对象调用函数的地址传入寄存器了,vs默认使用的__thiscall调用约定,标准没有 This指针本身取不了地址,调用约定不明确的原因 通过this指针修改其它的实例化对象借刀杀人 自己写的初始化函数外面可以多次调用,使用者不按约定套路来,破坏程序正常逻辑或造成内存泄漏 忘记调用初始化函数与忘记调用反初始化调用函数 面向对象过程当中一定会有初始化函数 构造函数 解决问题 初始化函数忘记调用 重复调用初始化函数 反初始化函数忘记调用 语法 没有返回值、可以 ......

CVE-2019-0708漏洞复现及修复补丁

Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广,windows2003、windows2008、windows2008 R2、windows xp系统都会遭到攻击,该服务器漏洞利用方式是通过远程桌面端口3389,RDP协议进行攻击的。这个漏洞是今年来说危害严重性最大的漏洞,跟之前的勒索,永恒之蓝病毒差不多。 CVE-2019-0708漏洞是通过检查用户的身份认证,导致可以绕过认证,不用任何的交互,直接通过rdp协议进行连接发送恶意代码执行命令到服务器中去。如果被攻击者利用,会导致服务器入侵,中病毒,像WannaCry 永恒之蓝漏洞一样大规模的感 ......

30_友元和引用计数

作业讲解 1.只能产生一个对象(单例模式),构造私有了编译器报错。类里面私有提供一个静态对象,类里面公有静态方法产生一个对象,返回静态对象。解决了资源浪费 Class A { Public: Static A* getInstance() {        Return theObj; } Private:         A()         { } ~A { } Static A theObj; } A A::theObj; 2.只能在堆上产生对象,直接把析构设为私有,提供一个自杀函数 Class B { Public: B() {};  Void kill() {delete this}; Private: ~B() {}; } 3.只能在栈上创建对象 通过第一个控制创建的对象,自杀的方法,控制次数 ......

29_常成员初始化列表静态函数

常成员函数 常成员函数,在成员函数后面加上const 作用,防止自己修改数据成员 const修饰的指针对象不能调用成员函数,只能调用常成员函数 static_cast转换类型,有风险不让转 初始化列表 const修饰的数据成员在C11之前不能直接初始化 初始化列表,构造函数外面加冒号 成员对象(值),以逗号分隔。可以初始化const修饰的数据成员与指明成员对象的构造参数 初始化列表的顺序,不影响顺序 数据成员对象比初始化列表先初始化,按照定义顺序构造 先析构自己,再反顺序析构成员对象 静态数据成员 errrno接受错误 替代了C语言的全局 ......

28_拷贝构造与动态字符串

拷贝构造 先实例化先构造 把实例化的一个对象赋值的给另一个对象的时候相当于memcpy //造成重复释放与没有释放 和构造函数一样,不过参数是当前类对象的引用 数据成员有指针需要使用 语法 CLASS cs; CLASS cs2 = cs;      //拷贝构造 浅拷贝 直接拷贝所有相等的,会造成重复释放,VS默认拷贝构造为浅拷贝 深拷贝 堆空间重新申请,指向不一样的堆空间 动态字符串的封装 动态字符串(输入多大申请多大),能想到的字符串操作 拷贝 长度 拼接 大小写 子串(反向查找) 查找位置(库函数都是从左向右,可以方向查找) 比较 类型 ......

26_类

面向对象编程 面向对象编程思想,经验的提炼,找出会变化的代码 抽象:例如所有车都有的功能,根据现实中的经验去分类,可以无限扩展,结构体应该写什么数据,有什么函数 封装:限制对象的活动范围,get、set,通过函数来中转。能想到类的所有操作方式 为了保护封装性,C++类给出了权限划分 为了调用方便,不用每次调用函数 类 类的权限划分,public公有,private私有,protected受保护的 类里面分为两个东西 属性、数据成员、字段—》都是一个意思 函数成员、成员函数、方法—》都是一个意思 this表示使用传递进来的指针, ......

25_内联函数与函数重载

内联函数 1.关键字inline 2.函数:优点:空间小 缺点:效率低 拿时间换空间 宏:优点:效率高 缺点:空间占用大 拿空间换时间 带参宏传参的时候用”++”和”–”无法解决这个bug,C++用内联函数取代 3.效果:根据编译器觉得这个函数是函数最好还是宏最好 4.debug版本不会内联(为了调试),release才会内联 5.inline关键字一般写到函数实现中,函数实现简单才会被编译器内联 6.inline实现和声明要写一样 函数重载 来源于泛型(广泛)编程,主要解决类型问题 函数重载是多态的体现 调用的时候只要丢失精度或者类型不匹配可能构成二义性 ......