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

网站开发运行及维护我要申请邮箱

网站开发运行及维护,我要申请邮箱,网络营销师证书有用吗,网站建设 app现在也是结束了初阶部分的内容#xff0c;今天开始就进入进阶部分了。一刻也没有为初阶的结束而哀悼#xff0c;立刻赶来“战场”的是进阶部分里的继承 文章目录 1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1继承的格式1.2.2再讲访问限定符(详讲protected)1.2.3**继承…现在也是结束了初阶部分的内容今天开始就进入进阶部分了。一刻也没有为初阶的结束而哀悼立刻赶来“战场”的是进阶部分里的继承 文章目录 1.继承的概念和定义1.1继承的概念1.2继承的定义1.2.1继承的格式1.2.2再讲访问限定符(详讲protected)1.2.3**继承基类成员三种访问方式** 2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数4.1构造函数4.2重载和析构函数 5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承7.1单继承、多继承和菱形继承7.2解决菱形继承7.3解决菱形继承原理 8.继承和组合 1.继承的概念和定义 1.1继承的概念 继承(inheritance)是一种面向对象编程的机制允许一个类派生类从另一个类基类继承属性和行为。 继承机制是面向对象程序设计中使代码可以复用的最重要的手段它允许程序员在保持原有类特性的基础上进行扩展增加功能这样产生新的类称派生类。继承呈现了面向对象程序设计的层次结构体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用继承是类设计层次的复用 #includeiostream #includestring using namespace std;class Person { public:void Print(){cout name: _name endl;cout age: _age endl;} protected:string _name Nero;int _age 18; };class Teacher :public Person//公有继承 { protected:int _jobid;//老师的工号 };class Student :public Person { protected:int _stuid;//学生的学号 };int main(){Student s;Teacher t;s.Print();t.Print();return 0; }1.2继承的定义 1.2.1继承的格式 class Base {// 基类的成员和方法 };class Derived : [访问权限] Base {// 派生类的成员和方法 }; class Base 表示基类的定义。class Derived : [访问权限] Base 表示派生类的定义并指定基类为 Base。[访问权限] 可选表示继承的访问权限可以是 public、protected 或 private。如果不指定默认为 private。 1.2.2再讲访问限定符(详讲protected) Public成员 public成员在类的内部和外部都可以被访问。类的外部代码可以直接访问对象的public成员。 Protected成员 protected成员在类的内部可以被访问但在类的外部不能直接访问。派生类子类可以访问基类父类的protected成员。 Private成员 private成员只能在类的内部被访问外部不能直接访问。派生类也不能访问基类的private成员。 所以protected和private的访问权限相同针对本类内外来说但是二者对继承的子类来说是不一样的 相对应的访问限定符有三个。那么继承方式也是有三种继承 1.2.3继承基类成员三种访问方式 类成员/继承方式public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员基类的private成员在派生类中不可见在派生类中不可见在派生类中不可见 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。 基类private成员在派生类中是不能被访问如果基类成员不想在类外直接被访问但需要在派生类中能访问就定义为protected。可以看出保护成员限定符是因继承才出现的 实际上面的表格我们进行一下总结会发现基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式相等于Min(成员在基类的访问限定符继承方式)public protected private 使用关键字class时默认的继承方式是private使用struct时默认的继承方式是public当然我们最好还是显示的写出继承方式。 在实际运用中一般使用都是public继承几乎很少使用protetced/private继承也不提倡使用protetced/private继承因为protetced/private继承下来的成员都只能在派生类的类里面使用 class A { public:int _public; protected:int _protected; private:int _private; };class B :public A { public:void print_public(){cout _public endl;}void print_protected(){cout _protected endl;}void print_private(){cout _private endl;} };int main() {B b;return 0; }这里可以看到已经报错了因为基类的private成员在派生类中是不可见的 2.基类和派生类对象赋值转换 派生类对象可以赋值给基类的对象/ 基类的指针/基类的引用。有个形象的说法叫切片或者切割走了一个特殊处理中间不会产生一个临时变量寓意把派生类中父类那部分切来赋值过去。 基类对象不能赋值给派生类对象(目前是这样的) 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。 class Student : public Person//学生类继承于Person类 { public:int _No; // 学号学生类自己的成员变量 }; void test1() {Student stu;//子类对象可以赋值给父类对象/指针/引用Person per stu;//走了一个特殊处理中间不会产生一个临时变量Person* pper stu;//这个指针也是直接指向对象费父类那一部分Person rper stu;//基类对象不能赋值给派生类对象stu per;//基类的指针可以通过强制类型转换赋值给派生类的指针pper stu;Student * ps1 (Student*)pper; // 这种情况转换时可以的。ps1-_No 10;pper per;Student* ps2 (Student*)pper; // 这种情况转换时虽然可以但是会存在越界访问的问题ps2-_No 10; }int main() {test1();return 0; }可以看到有些地方是报错了的 3.继承中的作用域 在继承体系中基类和派生类都有独立的作用域。 子类和父类中有同名成员子类成员将屏蔽父类对同名成员的直接访问这种情况叫隐藏也叫重定义。在子类成员函数中可以使用 基类::基类成员来显示访问父类的 需要注意的是如果是成员函数的隐藏只需要函数名相同(返回值和参数数量、类型可以不同)就构成隐藏。 注意在实际中在继承体系里面最好不要定义同名的成员 class Person { protected:string _name Neor; // 姓名int _id 111;//身份证号 };class Student : public Person { public:void Print(){cout 学号: _id endl;cout 身份证号 Person::_id endl;} protected:int _id 888; // 学号 };void test1() {Student s1;s1.Print(); };int main() {test1();return 0; }4.派生类的默认成员函数 4.1构造函数 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数则必须在派生类构造函数的初始化列表阶段显示调用(顺序是先父后子)。 派生类对象初始化先调用基类构造再调派生类构造 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化 4.2重载和析构函数 派生类的operator必须要调用基类的operator完成基类的复制 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序(先子后父) 派生类对象析构清理先调用派生类析构再调基类的析构编译器会对析构函数名进行特殊处理处理成destrutor()所以父类析构函数不加virtual的情况下子类析构函数和父类析构函数构成隐藏关系 class Person { public:Person(const char* name peter): _name(name){cout 构造函数Person() endl;}Person(const Person p): _name(p._name){cout 拷贝构造Person(const Person p) endl;}Person operator(const Person p){cout Person operator(const Person p) endl;if (this ! p)_name p._name;return *this;}~Person(){cout 析构函数~Person() endl;} protected:string _name; // 姓名 };class Student : public Person { public:Student(const char* name, int num): Person(name)//当没有默认构造函数时就要这样进行显示调用, _num(num){cout Student() endl;}Student(const Student s): Person(s)//如果想要自己进行显示调用怎么得到子类当中父类的部分呢利用截断, _num(s._num){cout Student(const Student s) endl;}Student operator (const Student s){cout Student operator (const Student s) endl;if (this ! s){Person::operator (s);//直接operator (s)会因为隐藏一直调用_num s._num;}return *this;}~Student(){cout ~Student() endl;} protected:int _num; //学号 };void test2() {Student s1(Nero, 18); }int main() {test2();return 0; }派生这些默认成员函数规则其实跟以前类似 唯一不同的是不管是构造初始化/拷贝/析构多了父类那一部分。原则: 父类那部分调用父类的对应函数完成 5.继承与友元 友元关系不能继承也就是说基类友元不能访问子类私有和保护成员 class A { public:int _pa;friend void print(B bb);//这个print是A的友元 protected:int _a; };class B :public A { public:int _pb; protected:int _b; };void print(B bb) {cout 公有的_pb bb._pa;cout 私有的_b bb._b;//cout 公有的_pb bb._pb;//cout 私有的_b bb._b; }class A { public:int _pa;friend void print(B bb);//这个print是A的友元 protected:int _a; };class B :public A { public:int _pb;friend void print(B bb); protected:int _b; };void print(B bb) {cout 公有的_pb bb._pa;cout 私有的_b bb._b;//cout 公有的_pb bb._pb;//cout 私有的_b bb._b; }这样才对 6.继承与静态成员 基类定义了static静态成员则整个继承体系里面只有一个这样的成员。无论派生出多少个子类都只有一个static成员实例 class Person { public:Person() {_count; } protected:string _name; // 姓名 public:static int _count; // 统计人的个数。 };int Person::_count 0;class Student : public Person { protected:int _stuNum; // 学号 };int main() {Person p1;Person p2;Student s2;cout Person::_count endl;cout Student::_count endl;return 0; }7.复杂的菱形继承及菱形虚拟继承 7.1单继承、多继承和菱形继承 单继承一个子类只有一个直接父类时称这个继承关系为单继承 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承 就有可能出现一种特殊情况菱形继承 菱形继承的问题从下面的对象成员模型构造可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份 class Person { public:string _name; // 姓名 };class Student : public Person { protected:int _num; //学号 };class Teacher :public Person { protected:int _id; // 老师编号 };class Assistant : public Student, public Teacher { protected:string _majorCourse; // 主修课程 };void test3() {Assistant a;a._name Nero; }int main() {test3();return 0; }7.2解决菱形继承 虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系在Student和Teacher的继承Person时使用虚拟继承(在:后面加上virtual)即可解决问题。需要注意的是虚拟继承不要在其他地方去使用。 我们要知道是哪几个继承时导致了二义性把那些继承变为虚拟继承就行了上面这个例子就是Student和Teacher的继承 class Person { public:string _name; // 姓名 };class Student : virtual public Person { protected:int _num; //学号 };class Teacher : virtual public Person { protected:int _id; // 老师编号 };class Assistant : public Student, public Teacher { protected:string _majorCourse; // 主修课程 };void test3() {Assistant a;a._name Nero;//此时就可以了 }int main() {test3();return 0; }7.3解决菱形继承原理 这里为了探讨这个问题先给出下列代码 class A { public:int _a; };class B : virtual public A { public:int _b; };class C : virtual public A { public:int _c; };class D : public B, public C { public:int _d; };int main() {D d;d.B::_a 1;d.C::_a 2;d._b 3;d._c 4;d._d 5;return 0; }D对象中将A放到的了对象组成的最下面这个A同时属于B和C那么B和C如何去找到公共的A呢这里是通过了B和C的两个指针指向的一张表。这两个指针叫虚基表指针这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A 8.继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象 ; 组合是一种has-a的关系。假设B组合了A每个B对象中都有一个A对象。 优先使用对象组合而不是类继承(继承的耦合度高) 。 继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言在继承方式中基类的内部细节对子类可见 。继承一定程度破坏了基类的封装基类的改变对派生类有很大的影响。派生类和基类间的依赖关系很强耦合度高。 对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse)因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系耦合度低。优先使用对象组合有助于你保持每个类被封装。 实际尽量多去用组合。组合的耦合度低代码维护性好。不过继承也有用武之地的有些关系就适合继承那就用继承另外要实现多态也必须要继承。类之间的关系可以用继承可以用组合就用组合 继承讲完了那下次肯定就是多态啦感谢大家支持
http://www.hkea.cn/news/14503929/

相关文章:

  • 百度站长工具数据提交云南文投建设投资有限公司网站
  • 手机网站导航栏如何做三联网站建设价格
  • 当地人做导游的旅游网站微信公众号优惠劵网站怎么做的
  • 网站打不开了什么原因wordpress源代码怎么修改
  • 建站平台 在线提交功能证券公司网站建设方案
  • 林州网站建设熊掌号网页打不开无法连接服务器
  • 建设部网站2015年第158号网站建设开发哪个好学
  • 网站建设在哪学做非法网站判什么邢
  • .net美食网站开发源代码汕头老城图片
  • 如何创建一个个人网站在哪里建设网站
  • 盗版网站怎么做的阿里云wordpress root
  • 广东网站推广策略建设厅网站上报名
  • 做钢化膜网站广告网站建设与制作
  • 建设网站怎么建立服务器建设规划
  • 招远住房和规划建设管理局网站wordpress 知识管理主题
  • 汽车网站建设制作费用相册管理网站模板下载失败
  • 网站布局结构主要分为建设银行官方网站个人系统板块
  • 水果网站建设案例浦北县住房和城乡建设局网站
  • 成都网站seo技术怎么把自己的网站推广
  • 四川省城乡住房建设厅网站如何构建wordpress
  • 怎么把网站和域名绑定360商城官网
  • 家具网站开发设计任务书建设厅执业注册中心网站
  • 建设企业网站初始必备的六大功能梧州市建设局官方网站
  • 如何看一个网站开发语言软件开发外包项目合作
  • 莱芜买房网站太原百度快速排名提升
  • 杭州服装网站建设安卓 网站整站下载
  • 网站建设公司 长春怎样做网站內链
  • 长沙 网站优化网站开发者不给源代码怎么办
  • 深圳中高端网站建设如何做文献ppt模板下载网站
  • 南庄顺德网站建设wordpress批量导入txt