ImageVerifierCode 换一换
格式:PPT , 页数:75 ,大小:186KB ,
资源ID:13322244      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/13322244.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(第15章继承与派生.ppt)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

第15章继承与派生.ppt

1、单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,前一页,休息,第,15,章 继承与派生,15.1,类的继承与派生,(,单继承与多继承,),15.2,继承时的构造函数,15.3,单继承时的析构函数,15.4,同名覆盖原则,15.5,虚基类,1,事物的共性与特性,2,15.1,类的继承与派生,保持已有类的特性而构造新类的过程称为继承。,在已有类的基础上新增自己的特性而产生新类的过程称为派生。,被继承的已有类称为基类(或父类)。,派生出的新类称为派生类(或子类)。,基类与派生类是相对而言的。,直接参与派生出某类的基类称为直接基类。,基类的基类或更高层的基类称

2、为间接基类,(,祖先类,),。,3,继承与派生问题举例,4,继承与派生问题举例,5,单继承与多继承,单,继承,:,一个派生类只有一个直接基类,多继承,:,一个派生类可以同时有多个基类,6,继承与派生的目的,继承的目的:实现代码重用。,派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。,7,通过继承派生新类的优越性,代码重用,提高编程效率,降低开发成本。,更有效地保持共有特性的一致性。,提高系统的可维护性。,是实现多态性,(,同一接口,不同方法,),的基础。,8,派生类的声明,class,派生类名:,继承方式,基类名,派生类成员声明;,9,派生类生成过程,

3、吸收基类成员,派生类接受了基类中除构造函数和析构,函数外的所有成员。,改造基类成员,改变,基类成员的访问属性,对,基类数据或函数成员的覆盖,添加新成员,给派生类增加适当的,数据和函数成员以实现新的功能。,10,派生类对象的构成,私有成员,保护成员,公有成员,私有成员,保护成员,公有成员,继承部分,新定义部分,派生类,派生类成员,11,继承方式,不同继承方式的影响主要体现在:,1,、派生类,成员,对基类成员的访问控制。,2,、派生类,对象,对基类成员的访问控制。,三种继承方式,公有继承,私有继承,保护继承,12,公有继承,(public),原基类,私有,Private,私有,Protected,

4、保护,public,公有,原基类,私有,Private,私有,Protected,保护,public,公有,原访问属性,继承后访问属性,公有,(public),继承时访问属性的变化,13,15.1.1,公有继承,(public),基类的,public,和,protected,成员的访问属性在派生类中,保持不变,,但,基类的,private,成员,不可访问,。,派生类中的,成员函数,可以直接访问基类中的,public,和,protected,成员,但不能访问基类的,private,成员。,通过派生类的,对象,只能访问基类的,public,成员,。,14,例,8-1,公有继承举例,class Po

5、int/,基类,Point,类的声明,public:/,公有函数成员,void,InitP(float,xx=0,float yy=0),X=xx;Y=yy;,void,Move(float,xoff,float,yoff,),X+=,xoff;Y,+=,yoff,;,float GetX,(),return X;,float GetY,(),return Y;,private:/,私有数据成员,float X,Y;,;,15,class Rectangle:public Point /,派生类声明,public:/,新增公有函数成员,void InitR(float x,float y,fl

6、oat w,float h),InitP,(x,y);W=w;H=h;,/,调用基类公有成员函数,float GetH,(),return H;,float GetW,(),return W;,private:/,新增私有数据成员,float W,H;,;,16,#include,#include,int main,(),Rectangle rect;,rect.InitR(2,3,20,10);,/,通过派生类对象访问基类公有成员,rect.,Move,(3,2);,coutrect.,GetX,(,),/,只能访问基类的,public,成员。,cout,rect.,GetY,(),cout

7、 rect.GetW,(,),cout rect.GetH,(,),endl;,return 0;,程序输出结果:,5,5,20,10,17,15.1.2,私有继承,(private),原基类,私有,Private,私有,Protected,保护,public,公有,原基类,私有,Private,私有,Protected,保护,public,公有,原访问属性,继承后访问属性,私有,(private),继承时访问属性的变化,18,私有继承,(private),基类的,public,和,protected,成员都以,private,身份出现在派生类中,但基类的,private,成员,不可访问,。,

8、派生类中的,成员函数,可以直接访问基类中的,public,和,protected,成员,但,不能访问基类的,private,成员,。,通过派生类的,对象,不能访问,基类中的任何成员。,19,例,8-2.1,私有继承举例,class Rectangle:private Point/,派生类声明,public:/,新增外部接口,void InitR(float x,float y,float w,float h),InitP(x,y);,W=w;H=h;/,访问基类公有成员,void Move(float,xoff,float,yoff,),Point:Move,(xoff,yoff,);,flo

9、at GetX,(),return,Point:GetX,(),;,float GetY,(),return,Point:GetY,(),;,float GetH,(),return H;,float GetW,(),return W;,private:/,新增私有数据,float W,H;,;,20,#include,#includeint main,(),int main,(),/,通过派生类对象只能访问本类成员,Rectangle rect;,rect.,InitR,(2,3,20,10);,rect.,Move,(3,2);,coutrect.,GetX,(),rect.,GetY,(

10、rect.,GetH,(),rect.,GetW,(),endl;,return 0;,21,例,8-2.2,私有继承举例,/,定义基类,class location,private:,int x,y;,public:,void initl(int x1,int y1);,void move(int x2,int y2);,int getx()return x;,int gety()return y;,;,void location:initl(int x1,int y1),x=x1;y=y1;,void location:move(int x2,int y2),x+=x2;y+=y2;,

11、22,class rectangle:private location,private:int h,w;,public:,void initr(int x,int y,int w1,int h1);,initl(x,y);,w=w1;,h=h1;,void move(int x2,int y2);,location:move(x2,y2);,int getx()return location:getx();,int gety()return location:gety();,int geth()return h;,int getw()return w;,;,void main(),rectan

12、gle rect;,rect.initr(2,3,20,10);,rect.move(3,2);,coutrect.getx(),;,coutrect.gety(),;,coutrect.geth(),;,coutrect.getw()endl;,程序输出结果:,5,5,10,20,23,15.1.3,保护继承,(protected),原基类,私有,Private,私有,Protected,保护,public,公有,原基类,私有,Private,私有,Protected,保护,public,公有,原访问属性,继承后访问属性,保护,(protected),继承时访问属性的变化,24,保护继承,(

13、protected),基类的,public,和,protected,成员都以,protected,身份出现,在派生类中,但基类的,private,成员,不可访问,。,派生类中的,成员函数,可以直接访问基类中的,public,和,protected,成员,但,不能访问基类的,private,成员,。,通过派生类的,对象不能,访问基类中的,任何成员,25,protected,成员的特点与作用,对建立其所在类对象的模块来说(水平访问时),它与,private,成员的性质相同。,对于其派生类来说(垂直访问时),它与,public,成员的性质相同。,既实现了数据隐藏,又方便继承,实现代码重用。,26,例

14、8-3 protected,成员举例,class A,int i,j;,public,void get_ij();,class B:public A,int k;,public,int get_ik();,void make_k();,/void make_k(),k=i*j;/,访问错误,class A,protected:,int i,j;,public,void get_ij();,class B:public A,int k;,public,int get_ik();,void make_k();,/void make_k(),k=i*j;/,垂直访问,27,class A,prot

15、ected:,int x;,int main,(),A a;,a.X=5;/,水平访问错误,28,基类与派生类的对应关系,单继承,派生类只从一个基类派生。,多继承,派生类从多个基类派生。,多重派生,由一个基类派生出多个不同的派生类。,多层派生,派生类又作为基类,继续派生新的类。,29,多继承时派生类的声明,class,派生类名:继承方式,1,基类名,1,,继承方式,2,基类名,2,,,.,成员声明;,注意:每一个,“,继承方式,”,,只用于限制对紧随其后之基类的继承。,30,多继承举例,08_3,class A,public:,void setA(int);,void showA();,pri

16、vate:,int a;,;,class B,public:,void setB(int);,void showB();,private:,int b;,class C:,public A,private,B,public:,void setC(int,int,int);,void showC();,private:,int c;,31,void A:setA(int x),a=x;,void B:setB(int x),b=x;,void C:setC(int x,int y,int z),/,派生类成员直接访问基类的公有成员,SetA(x);,SetB(y);,c=z;,/,其它函数实现略

17、int main,(),C obj;,obj.,setA(5),;,obj.,showA,(),;,obj.setC(6,7,9);,obj.showC,(),;,/obj.,setB(6),;,错误,/obj.,showB,(),;,错误,return 0;,32,表,8-1,不同继承方式的基类和派生类特性,继承方式,基类特性,派生类特性,公有继承,public,public,protected,protected,private,不可访问,私有继承,public,private,protected,private,private,不可访问,保护继承,public,protected,pr

18、otected,protected,private,不可访问,33,15.2,继承时的构造函数,基类的构造函数不被继承,需要在派生类中自行声明。,声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化由基类完成。,34,15.2.1,单一继承时的构造函数,派生类名,:,派生类名,(,基类所需的形参,本类成员所需的形参,):,基类名,(,参数,),本类成员初始化赋值语句;,;,35,单一继承时的构造函数举例,08_4,#include,class B,public:,B();,B(int i);,B();,void Print()const;,private:,int b;

19、B:B(),b=0;,coutBs default constructor called.endl;,36,B:B(int i),b=i;,coutBs constructor called.endl;,B:B(),coutBs destructor called.endl;,void B:Print()const,coutbendl;,37,class C:public B,public:,C();,C(int i,int j);,C();,void Print()const;,private:,int c;,;,C:C(),c=0;,coutCs default constructo

20、r called.endl;,C:C(int i,int j):B(i),c=j;,coutCs constructor called.endl;,38,C:C(),coutCs destructor called.endl;,void C:Print()const,B:Print();,coutcendl;,int main,(),C obj(5,6);,obj.Print,(),;,return 0;,输出 结果,:,Bs constructor called.,Cs constructor called.,5,6,Cs destructor called.,Bs destructor c

21、alled.,39,15.2.2,多继承时的构造函数,派生类名,:,派生类名,(,基类,1,形参,,基类,2,形参,,.,基类,n,形参,,本类形参,):,基类名,1(,参数,),基类名,2(,参数,),.,基类名,n(,参数,),本类成员初始化赋值语句;,;,40,派生类与基类的构造函数,当基类中声明有缺省形式的构造函数或未声明构造函数时,派生类构造函数的声明中可以省略对基类构造函数的调用。,若基类中未声明构造函数,派生类中也可以不声明,全采用缺省形式构造函数。,当基类声明有带形参的构造函数时,派生类也应声明带形参的构造函数,提供将参数传递给基类构造函数的途径。,41,多继承且有内嵌对象时的

22、构造函数,派生类名,:,派生类名,(,基类,1,形参,基类,2,形参,,.,基类,n,形参,本类形参,):,基类名,1(,参数,),基类名,2(,参数,),.,基类名,n(,参数,),,,对象数据成员的初始化,本类成员初始化赋值语句;,;,42,构造函数的调用次序,1,调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。,2,声明成员对象时调用构造函数,调用顺序按照它们在类中声明的顺序。,43,例,8-4,派生类构造函数举例,#include,class B1/,基类,B1,,,构造函数有参数,public:,B1(int i)coutconstructing B1iendl;,

23、class B2/,基类,B2,,,构造函数有参数,public:,B2(int j)coutconstructing B2jendl;,;,class B3/,基类,B3,,,构造函数无参数,public:,B3,(),coutconstructing B3*endl;,;,44,class C:public B2,public B1,public B3,public:/,派生类的公有成员,C(int a,int b,int c,int d):,B1(a),B2(b),memberB2(d),memberB1(c);,private:/,派生类的私有对象成员,B1 memberB1;,B

24、2 memberB2;,B3 memberB3;,;,45,void main,(),C obj(1,2,3,4);,输出结果,:,constructing B2 2,constructing B1 1,constructing B3*,constructing B1 3,constructing B2 4,constructing B3*,46,15.3,继承时的析构函数,析构函数也不被继承,派生类自行声明。,声明方法与一般(无继承关系时)类的析构函数相同。,不需要显式地调用基类的析构函数,系统会自动隐式调用。,析构函数的调用次序与构造函数相反。,47,例,8-5,派生类析构函数举例,#in

25、clude,class B1/,基类,B1,声明,public:,B1(int i),coutconstructing B1 iendl;,B1,(),coutdestructing B1 endl;,;,48,class B2/,基类,B2,声明,public:,B2(int j),coutconstructing B2 jendl;,B2,(),coutdestructing B2 endl;,;,class B3/,基类,B3,声明,public:,B3,(),coutconstructing B3*endl;,B3,(),coutdestructing B3 endl;,;,49,cl

26、ass C:public B2,public B1,public B3,public:,C(int a,int b,int c,int d):,B1(a),memberB2(d),memberB1(c),B2(b);,private:,B1 memberB1;,B2 memberB2;,B3 memberB3;,;,void main(),C obj(1,2,3,4);,50,输出结果,:,constructing B2 2,constructing B1 1,constructing B3*,constructing B1 3,constructing B2 4,constructing B

27、3*,输出结果,:,destructing B3,destructing B2,destructing B1,destructing B3,destructing B1,destructing B2,51,15.4,同名覆盖原则,当派生类与基类中有相同成员时:,若未强行指名,则通过派生类对象使用的是派生类中的同名成员。,如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定,(,作用域限定运算符,:),。,52,例,8-6,多继承同名覆盖举例,#include,class B1/,声明基类,B1,public:/,外部接口,int nV;,void fun,(),coutMember

28、of B1endl;,;,53,class B2/,声明基类,B2,public:/,外部接口,int nV;,void fun,(),coutMember of B2endl;,;,class D1:public B1,public B2,public:,int nV;/,同名数据成员,void fun,(),coutMember of D1endl;/,同名函数成员,;,54,void main,(),D1 d1;,d1.nV=1;/,对象名,.,成员名标识,访问,D1,类成员,d1.fun,(),;,d1.B1:nV=2;/,作用域限定运算符,访问基类,B1,成员,d1.B1:fun,(

29、d1.B2:nV=3;/,作用域限定运算符,访问基类,B2,成员,d1.B2:fun,(),;,输出结果:,Member of D1,Member of B1,Member of B2,55,二义性问题,在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性),采用虚函数或支配(同名覆盖)原则来解决。,当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性,采用虚基类来解决。,见,15.5,56,二义性问题举例,class A,public:,void f();,;,class B,public:,void f(

30、void g();,;,class C:public A,piblic B,public:,void g,(),;,void h,(),;,;,如果声明:,C c1;,则,c1.f,(),;/,具有二义性,而,c1.g,(),;/,无二义性(同名覆盖),c1.B:f,(),;/,无二义性,57,二义性的解决方法,解决方法一:用类名来限定,c1.A:f,(),或,c1.B:f,(),解决方法二:同名覆盖在,C,中声明一个同名成员函数,f(),再根据需要调用,A:f,()或,B:f,(),58,二义性问题举例,class B,public:,int b;,class B1:public B,

31、private:,int b1;,class B2:public B,private:,int b2;,;,class C:public B1,public B2,public:,int f,(),;,private:,int d;,二义性访问:,C c;c.b;c.B:b,正确的访问:,c.B1:b;c.B2:b,59,派生类,C,的对象的存储结构示意图:,b,b1,b,b2,d,B,类成员,B,类成员,B1,类成员,B2,类成员,C,类对象,60,15.5,虚基类,虚基类的引入,用于有共同基类的场合,声明,以,virtual,修饰说明基类例:,class B1:,virtual,publi

32、c B,作用,主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题。,为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。,注意:,在第一级继承时就要将共同基类设计为虚基类。,61,虚基类举例,class B private:int b;,class B1:,virtual,public B private:int b1;,class B2:,virtual,public B private:int b2;,class C:public B1,public B2 private:float d;,下面的访问是正确的:,C cobj;,cobj.b;,62,虚基类的派生类对象存

33、储结构示意图:,B,B1,B2,C,b1,b2,d,B1,类成员,B2,类成员,C,类对象,b,B,类成员,63,例,8-7,虚基类举例,D1,类,void fund,(),;,int nVd;,B1,类,int nV1;,D1,类,void fun,(),;,void fund,(),;,int,nV,;,int B1:nV1;,int B2:nV2;,int nVd;,B2,类,int nV2;,B0,类,void fun();,int nV;,64,B0,B1,新增成员,B0,B2,新增成员,D1,新增成员,B0,B0,B1,B2,D1,nV,fun(),65,#include,clas

34、s B0/,声明基类,B0,public:/,外部接口,int nV;,void fun,(),coutMember of B0endl;,;,class B1:,virtual,public B0 /B0,为虚基类,派生,B1,类,public:/,新增外部接口,int nV1;,;,66,class B2:,virtual,public B0 /B0,为虚基类派生,B2,类,public:/,新增外部接口,int nV2;,;,class D1:public B1,public B2/,派生,类,D1,声明,public:/,新增外部接口,int nVd;,void fund,(),cou

35、tMember of D1endl;,;,void main,(),/,程序主函数,D1 d1;/,声明,D1,类对象,d1,d1.nV=2;/,使用直接基类,d1.fun,(),;,67,虚基类及其派生类构造函数,建立对象时所指定的类称为,最(远)派生类,。,虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。,在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的缺省构造函数。,在建立对象时,只有最远派生类的构造函数调用虚基类的构造函数,该派生类的其它基类对虚基类构造函数的调用

36、被忽略。,68,有虚基类时的构造函数举例,#include,class B0/,声明基类,B0,public:/,外部接口,B0(int n)nV=n;,int nV;,void fun,(),coutMember of B0endl;,;,69,class B1:virtual public B0,public:,B1(int a):B0(a),int nV1;,;,class B2:virtual public B0,public:,B2(int a):B0(a),int nV2;,;,70,class D1:public B1,public B2,public:,D1(int a):B0

37、a),B1(a),B2(a),int nVd;,void fund,(),coutMember of D1endl;,;,void main,(),D1 d1(3);,d1.nV=2;,d1.fun,(,),;,输出结果:,Member of B0,71,赋值兼容原则,一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:,派生类的对象可以被赋值给基类对象。,派生类的对象可以初始化基类的引用。,指向基类的指针也可以指向派生类。,72,例,8-8,赋值兼容规则举例,#include,class B0/,基类,B0,声明,public:,void display,(),cou

38、tB0:display,(),endl;/,公有成员函数,;,73,class B1:public B0,public:,void display()coutB1:display()endl;,;,class D1:public B1,public:,void display()coutD1:display()display,(),;/,对象指针,-,成员名,74,void main,(),/,主函数,B0 b0;/,声明,B0,类对象,B1 b1;/,声明,B1,类对象,D1 d1;/,声明,D1,类对象,B0*p;/,声明,B0,类指针,p=/B0,类指针指向,B0,类对象,fun(p);,p=/B0,类指针指向,B1,类对象,fun(p);,p=/B0,类指针指向,D1,类对象,fun(p);,/,结果输出三次,B0:display,75,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服