当前位置: 首页 > news >正文

南宁北京网站建设合肥网络推广外包

南宁北京网站建设,合肥网络推广外包,企业网上推广方式,绍兴建设企业网站文章目录 前言概念访问限定符基类和派生类的赋值转换继承中的作用域派生类的默认成员函数构造函数 拷贝构造析构函数 继承的其他一些细节 前言 我们之前说过#xff0c;继承是面向对象的三大特性。 面向对象的三大特性#xff1a; 封装、继承、多态。 封装在类和对象体现出… 文章目录 前言概念访问限定符基类和派生类的赋值转换继承中的作用域派生类的默认成员函数构造函数 拷贝构造析构函数 继承的其他一些细节 前言 我们之前说过继承是面向对象的三大特性。 面向对象的三大特性 封装、继承、多态。 封装在类和对象体现出。 概念 继承是什么? 继承就是一种类层次的复用,复用就是你的就变成我的. 假设我要实现一个管理系统。 如果按照以前类和对象的方式,单独去实现这个类是很坑的. 每个类都有一些信息, 有些类型之间是有一些共性, 每个类都写,那初始化每个类都要写. C创造了一个语法,可以支持继承,支持什么样的继承呢? 把我们公共的属性提取出来,放到一个类里面去,让剩下的类去继承. 我们也可以有些单独独立的信息. 继承是什么样的呢 首先有很多类。如果这些类都有一些公共的特征那我们就可以这些 类里面有些特性提取出来专门放到一个类里面。这个类我们叫做父类。 我们想用这些特征以前我们要写到一起我们现在可以继承它。 怎么继承 我们看一下它的语法 //基类/父类 class Person { public:void Print(){cout name: _name endl;cout age: _age endl;}private: string _name peter; // 姓名int _age 18; // 年龄 };class Student : public Person { protected:int _stuid; // 学号 };继承方式有三种 公有继承私有继承保护继承。 student这个类看起来啥都没有其实里面啥都有。 它怎么来的就是从它的父类。 stuent这个类的信息除了有学生的信息还有pesorn的信息因为它继承了person. 继承也就是父类的我也有。 访问限定符 继承有三种访问限定符但这三种访问限定符又有三种访问限定方式。 它们两两组合。 这些有什么规律 它们分成了两组规则。 1.如果是公有成员和保护成员就取它们继承方式和它的权限里小的那个。(公有大于保护保护大于私有) 2.私有成员都是不可见。(不可见就是它在这个地方你不能用) 演示一下把父类的成员设置成私有 在子类写一个函数。 不可见就是在类里面也用不了但是它跟私有不一样私有在类里面可以用。 什么时候我们会定义私有呢 这东西我不想被子类继承就用私有。 私有和保护在子类才有区别 子类能不能调用父类的函数取访问它 可以。不可见只是指的是不能直接取访问它取去调用父类的函数去访问也是可以的。 继承方式也可以像访问限定符一样可以不写class默认就是私有继承struct默认就是公有继承。 实际当中用的最多的就是这些。 基类和派生类的赋值转换 这是重点中的重点。这块想说的一个问题是什么 这里会发生什么d可以赋值给i吗 可以。发生隐式类型转换中间会产生临时变量临时变量具有常性。 接着往下看一个子类对象能不能给父类对象呢 可以但是有没有隐式类型转换的发生呢 这里只适用于公有继承上子类可以赋值给父类这个过程叫做赋值兼容转换。 怎么证明呢 子类可以赋值给父类父类能不能给子类 默认不可以子类还有一些专有的属性。 继承中的作用域 基类和派生类都有它们独立的作用域。 既然它们都有独立的作用域那基类和派生类能不能有同名成员呢 派生类能不能也定义一个_num,可以。 我们c语言就规定不同的作用域可以定义同名的变量。 但是这样我是会报错还是会访问派生类的呢 理论上是访问派生类的根据就近原则。 但是我就想访问基类有没有什么办法 指定作用域就可以了加上域作用限定符。 子类和父类有同名成员这种情况我们叫做隐藏或者重定义。 隐藏指的是默认情况下他会隐藏父类的成员。 class Person { protected:string _name 小李子; // 姓名int _num 111; // 身份证号 };class Student : public Person { public:void Print(){cout Person::_num endl;cout _num endl;}protected:int _num 999; // 学号 };这里有个很坑的东西经常出选择题考。 以下程序哪个是对的。 这道题的杀手锏是A,为什么是A? 函数名相同参数不同构成函数重载。 那现在有一个问题vector里的push_back和list里的push_back呢 记住函数重载必须在同一个作用域里面。 编译也没有报错。 虽然它们参数不同但是它们的关系确实是隐藏。 最麻烦的考法是这样的。 下面这个选什么。 这道题如果是不定向选择那就是BC. 如果确实要访问A里的fun, 要指定一下作用域 b.A::func();结论 如果是成员函数的隐藏只需要函数名相同就可以构成隐藏。 不需要考虑参数不需要考虑返回值。 注意在实际中最好不要定义同名的成员不然自己坑自己。 派生类的默认成员函数 构造函数 派生类的构造函数时怎么玩的呢 跟我们以前学的有一点点不一样。 注意看这个派生类我什么都没有写.发生了啥 如果我们不写子类会自动调用父类的成员。 如果我们写了呢 不可以。为什么呢 在派生类当中规定了父类的成员必须调父类的构造函数初始化。 你不写它也会调用父类的你写他也会调用父类的。 上面两个都可以编译通过。 你不写他也会调用父类的默认构造在初始化列表里调。 继承就像子类把父类当作一个自定义类型的整体成员一样。 那如果父类没有默认构造怎么办 那我们就必须自己写了自己显示的调用了。 拷贝构造 拷贝构造和前面也是同样的道理。 可以但是你自己不写他会不会调用父类的拷贝构造。 不会要初始化父类怎么办调用父类的拷贝构造。但是要求调用父类的拷贝构造 是不是要传一个父类的对象过去。 只有子类对象没有父类对象如何把子类对象父类这一部分拿出来啊。 我们可以用我们之前讲到的切片。 子类对象我也没有父类的那一部分但是我可以传过去让它自己切就可以了。 这里回答一下之前遗留下来的一个问题 如果是子类对象给父类对象这个地方是怎么给过去的 是memcpy拷贝过去还是怎么拷贝。 这里还是调用了拷贝构造调用了父类的拷贝构造。 operatro也是一样的道理 但是这里出现了一个栈溢出的问题是怎么回事呢 栈溢出一般都是重复调用这里教大家一个技巧可以看调用堆栈 死循环了。为什么 因为Student类里面的operator和Person类里面的operator构成隐藏关系。 所以这里自己调用自己了。 指定作用域就可以了 总结一下就是自己干自己的父类处理父类的。 可不可以不写拷贝构造和赋值呢 可以我们之前说过拷贝构造针对内置类型进行值拷贝或者浅拷贝 针对自定义类型会调用它的拷贝构造。 析构函数 特点都是先父后子 但是有个非常奇怪的现象我们调用不了析构。为什么 由于以后多态的原因析构不会用这个名字 析构函数会被处理成Destructro,所以它们会构成隐藏的关系。 所以还是指定一下。 但是这样也不行父类的析构被调用了两次。 其它成员函数都可以显示调用唯独析构函数我们不要显示调用。 它可以自动调用为什么它可以自动以为它要保证我们的顺序。 自己显示写不能保证调用先子后父的顺序。 为什么要先析构子类再析构父类 因为父类先定义子类后定义。 先析构父类再析构子类有可能会出现野指针的问题。 继承的其他一些细节 友元关系不能被继承。 比如一个类一个函数是你父类的友元那是不是你子类的友元呢 不是。 但是我就是想访问怎么办 再定义一个友元就可以了。 class Person { public:friend void Display(const Person p, const Student s); //protected:string _name; // 姓名 }; class Student : public Person {friend void Display(const Person p, const Student s); protected:int _stuNum; // 学号 };void Display(const Person p, const Student s) {cout p._name endl;cout s._stuNum endl; }void main() {Person p;Student s;Display(p, s); }静态成员是怎么走的 父类继承有一个_count,子类继承会不会也友一个_count呢 不会。但是从域的角度子类可以访问它。 无论你继承多少次都只有一个_count 静态成员变量属于整个类它不仅属于父类也属于子类。但是只有同一个。 证明一下 父类当中的_name和子类当中的_name是不是同一个。 不是它们的地址是不一样的。 但是_count是同一个。 把父类protected:去掉 下一个问题这里Peron或者以Peson为继承的子类对象总共创建了多少个对象 怎么算呢这里有一个非常巧妙的东西。在父类的构造函数_count就可以为什么 因为子类对象必须调用父类对象去初始化 静态的成员所有继承的派生类共享。 实现一个不能被继承的类如何实现 最简单的方式就是把它的构造函数私有化或者析构函数私有化。为什么 因为构造函数私有了继承了以后创建不了对象为什么 因为子类的构造函数必须去调用父类的构造函数而父类的构造函数私有子类调用不了。 A的构造函数私有B是无论如何也调用不了。 A怎么调用呢A是有办法的。 class A { public:static A CreateObj(){return A();} private:A(){} }; class B : public A {}; int main() { //要调用函数首先要创建对象 //我们可以用静态成员函数就可以直接用类去调用它A::CreateObj();return 0; }友元是能不用就不用。 其实C正常的继承学到这里也差不多了但是还有一个大坑我们留到下篇文章
http://wiki.neutronadmin.com/news/327232/

相关文章:

  • 网站后台更新内容后建筑设计有哪些专业
  • 网站建设与管理的专业群深圳建设局网站首页
  • 阿里云加WordPress建站成都网站制作-中国互联
  • 中国市场营销网网站搜索引擎优化总结感悟
  • 做网站的公司周年活动公司的网站如何建设
  • 电子商务网站建设复习题公共体育课程网站建设
  • 设计素材网站月收益漳州北京网站建设
  • 西安手机网站制作南京网站建设优化
  • 上海城乡建设部网站首页wordpress 公式
  • 通河新村街道网站建设线下推广活动有哪些
  • 淮阳网站建设小程序怎么开发自己的小程序代码
  • 效果图网站有哪些做网站加班
  • 购物网站排名2017企业微信公众号开发
  • 小网站怎么赚钱wordpress和帝国
  • 工业设计的网站2021安全员证报名入口
  • 团购网站怎么做推广班级优化大师的利和弊
  • scala做网站网站建设与管理自考本全国卷
  • 使用wordpress快速建站视频教程门户网站广告的类型
  • 下载网站系统免费生成网站软件下载
  • 天长企业网站制作网站请人做要多少钱
  • 网站页面跳转怎么做创建qq网站
  • 链接提交百度站长平台网站收录突然减少
  • 东莞企业网站推广西安网站建设哪家公司好
  • 网站信用认证可以自己做吗做pc端网站行情
  • 玉雕网站建设青岛网络优化
  • 南通网站建设心得网页编程培训学校
  • 建设部网站王尚春支付网站建设推广的会计分录
  • 广州黄埔网站制作阿里云网站建设流程教案
  • 可以建设一个网站如何做网站地图视频
  • 自助建站网站公司如何做网站的软件