欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第5部分派生类.ppt

    • 资源ID:2551254       资源大小:763.51KB        全文页数:67页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第5部分派生类.ppt

    第5章 派生类,5.1 派生类的概念,5.2 多继承,5.1.1 为什么要使用继承,5.1.2 保护段,5.1.3 基类的访问描述符,5.1.4 基类对象的初始化,5.1.5 Point类继承的一个例子,5.2.1 多继承的概念,5.2.2 虚基类,5.3 虚函数与多态性,5.3.1 基类对象的指针指向 派生类对象,5.3.2 虚函数,5.3.3 纯虚函数及抽象类,2019/4/7,2,5.1.1 为什么要使用继承 在最简单的情况下,一个类B继承类A或者从类A派生类B,通常将类A称为基类,类B称为派生类。 这时,类B的对象具有类A对象的所有特性,甚至还会更多一些。 也可以这样说,类B从类A派生出来。这意味着类B至少描述了与类A同样的接口,至少包含了同类A一样的数据,可以共享类A的成员函数。,5.1 派生类的概念,B,A,2019/4/7,3,类B继承了类A,那么类A的公有段成员可以传递给派生类B,当作类B自己的成员。 在创建派生类对象时,先要调用基类的构造函数, 以便分配基类的公有段程序存储空间。 实际上,由于调用了构造函数,一个派生类对象包含有一个基类对象,只是对于派生类而言,不能访问基类的私有段成员。,基类对象,ObjA,ojbB,派生类对象,#include class A int pri; public: int pub; void set_pri(int a) pri=a; void set_pub(int a) pub=a; void out_pri() coutpri“ ”; ;,class B: public A int pri1; public: int pub1; void set_pri1(int a) pri1=a; void set_pub1(int a) pub1=a; void out() coutpub“ ” pri1“ ”pub1; ;,定义派生类,例 5-1,void main() A objA; objA.set_pri(1); objA.set_pub(2); objA.out_pri(); B objB; objB.set_pri(3); objB.set_pub(4); objB.set_pri1(5); objB.set_pub1(6); objB.out_pri(); objB.out();,程序输出: 1 3 4 5 6,2019/4/7,5,基类对象 objA,派生类对象 objB,例 5-2 描述串的类 class string int length; char * contents; public: string( ) length=0; contents=0; string( ); int get_length( ) return length; char * get_contents( ) return contents; void set_contents(int in_length, char * in_contents); void set_contents(char * in_contents); ;,想在string类的基础上,扩充这些特殊的功能。这种情况下,继承是很有用的。,此类功能有限。 实际需要的是支持一些高级的功能。例如,可以设置一个光标,在光标处进行一些编辑功能:添加,替换, 删除一段正文等。,class edit_string : public string private : int cursor; public : int get_cursor_pos()return cursor; void move_cursor(int how_much); int add_at_cursor(string * new_text); int replace _at_cursor(string * new_text ); int delete _at_cursor(int how_much); ;,派生类类名,访问描述符,基类类名,在基类string中定义的公有段的数据和操作,在派生类edit_string中看到的也是公有的。edit_string类非常类似它的基类string。,2019/4/7,8,void main() string s1; edit_string s2; char * cp; s1.set_contents(8,“get this”); cp=s1.get_contents( ); s2.set_contents(8,cp); s2.move_cursor(4); s1.set_contents(7,“wombats”); s2.replace_at_cursor( ,s1,s2,2019/4/7,9,C+语言允许派生类可以重新定义基类的成员。如果派生类定义了与基类同名的成员,称派生类的成员覆盖了基类的同名成员。 如果要在派生类中使用基类的同名成员,可以显式的使用下述类名限定符: 类名:成员 此外可以,用下面的方法访问全局变量: :成员,例5-3 class base public: int a,b; class derived: public base public: int b,c; ;,下面的例子,派生类定义了一个数据成员b与基类的数据成员b同名,主函数main()给出了在派生类中怎样使用这两个同名成员的方法。,在派生类中定义了同名变量b,void main( ) derived d; d.a=1; d.base:b=2; d.b=3; d.c=4; base * bp= ,注意base:b使用的是base类的成员函数b,使用的是derived类的数据成员b,指向基类对象的指针变量可以指向派生类的对象因为派生类对象包含有一个基类对象,错误:bp仅能访问派生类中继承的基类成员,一个派生类从外部看,非常类似一个基类,但内部则有不同。 特别是,一个派生类没有权力访问它的基类的私有数据,就像其他任何类一样。 例如,edit_string类不能直接访问string类的contents域或length域。如果edit_string类的成员函数要使用contents,必须调用get_contents()来得到它。 一个类的私有成员对其他类不可以访问的原因是确保没有其他类的成员函数依赖它们。这就允许软件适应未来的改变,赋予面向对象方法以更大的能力。,当从现成的类派生出新类时,派生类有以下功能: 1) 增加新的数据成员。 2) 增加新的成员函数。 3) 重新定义数据成员。 4) 重新定义成员函数。,从编码的角度,派生类从基类中以较低的代价换来了较大的灵活性。一旦产生了可靠的基类,只需要调试派生类中所作的修改即可。 派生类从基类继承属性时,可使派生类扩展它们,或者对其进行限制,也可以改变删除。所有这些变化归结为两类基本的面向对象的继承技术:性质约束和性质扩展。,5.1.2 保护段,一个派生类继承其基类时,基类的所有私有段的成员不能被派生类访问。 例5-4,class X int i,j; public: void set_ij(int x,int y); void put_ij(); ; class Y : public X int k; public: int get_k(); void make_k(); ; void Y:make_k() k=i*j; ,错误:i,j是基类X的私有成员,不能被派生类Y访问。,2019/4/7,14,基类是否存在这样一类成员? 它们可以被派生类访问,但不能被其他类访问。除了基类和它的派生类可以看到这部分成员外,对其他类如同私有段成员一样。 重新定义为:,class X protected: int i,j; public : void get_ij(); void put_ij(); ;,i, j是类X的保护段成员,能被派生类Y访问。类Y的成员函数,类Y的成员函数 void Y:make_k() k=i*j; 就能正确工作了。但是,在类X和类Y的外部,人们仍然不能访问i和j。,2019/4/7,15,class 类名 private: protected: public: ;,私有成员段在类外不能被访问(除非友元关系);在派生类中不能访问,保护成员在类外不能被访问(除非友元关系);在派生类中仍为保护成员,公有成员在类外能被访问; 公有成员能被继承,除了基类和他的派生类外,保护段成员私有段 成员一样被隐藏起来。 类中可以有三种成员:,5.1.3 基类的访问描述符,为说明派生关系,派生类的说明为 class edit_string: public string ;,C+语言中,派生类的一般语法形式为 class 派生类名: 基类类名,基类类名, ;,关键字public称为访问描述符,其中: “:”后面罗列的是基类类名表,它是由“,”隔开一串元素,每个元素都是“基类类名”。 空声明的类不能作为一个类的基类。,表示访问描述符,2019/4/7,17,为private ,称为私有派生,基类的所有公有段成员和保护段成员都成为派生类私有段的成员。,访问描述符一般有三个: public private protected (很少用),当为private或缺省时,被认为是私有派生;,为public,称为公有派生,基类的所有公有段的元素仍是派生公有段的元素,基类的protected段的元素也是派生类protected段的元素。,2019/4/7,18,1. 公有派生 在公有派生情况下,基类保护成员和公有成员的访问全限在派生类中保持不变。即: 1) 基类的保护成员在派生类中仍然是保护成员。 2) 基类的公有成员在派生类中仍然是公有成员。 3) 基类的私有成员在派生类中成为派生类的不可访问成员。 一个类的不可访问成员是指该类包含有这些成员,但在类内和类外,都不能被直接访问。,2019/4/7,19,因此,对于一个派生类A,类的成员有四种:私有成员,保护成员,公有成员和不可访问成员。如果该派生类还以公有方式继续派生出它的派生类B,那么 1) A类的保护成员在派生类B中仍然是保护成员。 2) A类的公有成员在派生类B中仍然是公有成员。 3) A类的私有成员和不可访问成员在派生类B中成为派生类的不可访问成员。,#include class X protected: int i, j; public: void get_ij(); void put_ij(); ; class Y:public X int k; public: int get_k(); void make_k();,class Z : public Y public: void f(); ; void X:get_ij() coutij;,例 5-5,Y,X,Z,void X:put_ij() couti“ ”j“n”; int Y:get_k() return k; void Y:make_k() k=i*j; void Z:f() i=2; j=3; ,void main() Y objY; Z objZ; objY.get_ij(); objY.put_ij(); objY.make_k(); coutobjY.get_k()“n”; objZ.f(); objZ.put_ij(); ,X公有段和保护段的成员在Y中也是公有段和保护段的成员。同时,Y又公有派生出类Z,这时,Y的公有段和保护段的成员在Z中也是公有段和保护段的成员。,2019/4/7,22,在公有派生方式下,一个派生类的对象可以作为基类的对象使用,具体有3种情况: 1) 派生类的对象可以直接赋给基类的对象。 2) 基类对象的引用可以引用一个派生类对象。 3) 基类对象的指针可以指向一个派生类对象。 设基类为Base,公有派生类为Derived,那么 Base Bobj; Derived Dobj; Bobj=Dobj; Base ,2019/4/7,23,2. 私有派生 如果为private(或者缺省),那么基类的所有公有段和保护段的成员都成为派生类私有段的成员。称派生类是基类的私有派生类。即: 1)基类的保护成员在私有派生类中是私有成员 2)基类的公有成员在私有派生类中是私有成员 3) 基类的私有成员和不可访问成员在私有派 生类中成为派生类的不可访问成员 例 5-6 修改公有派生中的例子如下。,#include class X protected: int i, j; public: void get_ij(); void put_ij(); ;,class Z : public Y public: void f(); ;,Z又由类Y公有派生,则Y的公有段和保护段的成员成为Z的公有段和保护段成员。,Y,X,Z,派生类Y由基类X私有派生,X的公有段和保护段的成员在Y中变成了私有段的成员。,class Y : private X int k; public: int get_k(); void make_k(); ;,void X:get_ij() coutij; void X:put_ij() couti“ ”j“n”; int Y:get_k() k=i*j; void Z:f() i=2; j=3; ,错误:Z中为不可访问成员,错误,void main() Y objY; Z objZ; objY.get_ij(); objY.put_ij(); objY.make_k(); coutobjY.get_k()“n”; objZ.f(); objZ.put_ij(); ,错误,错误,类X的保护段成员i和j已经成了类Y的私有段成员,因此Y的派生类Z以及的对象都不能访问X的保护段成员i和j,公有段成员函数get_ij和put_ij()。,2019/4/7,26,class X public: void f(); ; class Y : X ; void g(Y *p) p-f(); ,代码包含了一个错误,分析错误的原因。,2019/4/7,27,实际上,C+语言还允许保护派生方式。保护派生方式下,基类的所有公有段成员和保护段成员都成为保护派生类保护段的成员; 基类的私有成员和不可访问成员在保护派生类中成为派生类的不可访问成员。 保护派生方式一般很少使用。,2019/4/7,28,派生后基类成员访问性的变化,2019/4/7,29,3. 静态成员的派生 static 成员受段约束符的限制,但不受访问描述符的限制。 基类和派生类共享基类的static成员。 不管是公有派生还是私有派生都不影响派生类对基类的静态成员的访问,但要求访问静态成员时,必须用“类名:成员”显式的说明。 例 5-7,#include class S static int s1; protected: static int s2; public: static int s3; static void set_s3() s3=1; void out() couts3; ;,class D : private S public: void set() S:s1=10; S:s2=20; S:s3=30; ;,Vc+可以,Tc不可以,可以访问,教材错误,2019/4/7,31,void main() S objS; S:s1=0; S:s2=0; S:s3=0; objS.out(); objS.set_s3(); objS.out(); D objD; objD.set(); objS.out(); ,若没有派生关系,结果是一样的。 可见,派生对于基类的static成员是没有影响的。,错误:类外访问私有成员,错误:类外访问保护段成员,类Y从基类X私有派生,因而类Y的派生类Z不能访问间接基类X所有成员。 若希望X的某几个成员还能被类Z访问,而不是像现在这样全部变成类Y的私有成员,让类Z根本看不到。 C+语言提供了一种调节机制,称为访问声明,它使得X的某几个成员能被类Z所访问 .,4.访问声明,Y,X,Z,私有派生,公有派生,访问声明仅能用于私有派生情况下。 访问声明的形式为: 基类类名:基类保护段或公有段数据成员; 基类类名:基类保护段或公有段成员函数名;,例 5-8,class B int a; public: int b, c; int bf( ); ;,class D : private B int d: public: B:c; int e; int df(); ;,使用访问声明 B:c 可以将类B的公有段成员c在私有派生类D中显式声明为公有的,D的派生类可以访问它。 由此可见,访问声明是一种调节机制,它是私有派生方法的一种补充。 对访问声明的使用需要注意以下几点:,调整对B:C的访问控制,2019/4/7,34,1)访问声明不能说明任何类型。 class B int a; public: int b, c; int bf( ); ; class D: private B int d; public: int B : c; ;,不能为访问声明B:c说明任何类型。,2019/4/7,35,2) 访问声明仅用于派生类中恢复名字的访问权限,不允许在派生类中降低或提升基类成员的可访问性。 例 5-9,class B private: int b; protected: int c; public: int a;,class D : private B public: B: a; B : b; protected: B : c; B: a; ;,从类的封装性的角度,这一限制是可以理解的。 试想,如果派生类能将其基类的私有段成员用访问声明提高其访问权限而成为公有段的 成员,就破坏了类的封装性。,错误,私有成员不能用于访问声明,错误,不能降低基类成员的可访问性,2019/4/7,36,3) 对重载函数名的访问声明将调整基类中具有该名的所有函数的访问域。 由于访问声明仅仅恢复名字的访问,对于重载函数名,它的访问声明将使所有同名的重载函数的访问权限都得到调整。例如:,class X public: f( ); f(int); ;,class Y : private X public: X : f; ;,使 X:f( )和X:f(int)在Y中都为公有的,2019/4/7,37,X:f表示访问声明仅仅调节名字,该函数名不带任何参数和类型; 具有不同访问域的重载函数名不能用于访问声明,即不可能调整它的访问权限。例 5-10,class X private: f(int); public: f( ); ; class Y : private X public: X : f; ;,错误,访问声明具有二义性,不能调整其访问,2019/4/7,38,如果基类的一个成员在派生类中也把同一名字定义为一个成员,则不可以调整它的访问。 例 5-11,class X public: void f( ); ; class Y : private X public: void f(int); X:f; ;,错误,f的二次说明,不能调整其访问,5.1.4 基类对象的初始化,1.类等级 类X出现在类Y的基类类名表中,它被称为类Y的直接基类。 类Y也是类Z的直接基类。类X不是类Z的直接基类,但它是类Y的直接基类,称类X为类Z的间接基类。 这样,类X,Y和Z形成了一个类等级,如图:,class Y : private X int k; public: int get_k();,class Z : public Y public: void f();,class X protected: int i, j; public: void get_ij();,2019/4/7,40,在类等级中,若一个类只有一个直接基类,这种继承关系称为单继承。若一个类有多个直接基类,这种继承关系称为多继承。 在一派生类中要访问与派生类成员同名的基类成员,使用 类名:成员 的方式,其中类名可以是某个间接基类的类名,因而成员也是这个间接基类的成员。这简单说明了从哪一个类开始寻找该成员。,例 5-12 class A public: void f(); ; class B : public A ; class C: public B public: void f( ); void g( ); ;,void C:g( ) f(); A:f(); B:f(); Void main() C Cobj; Cobj.f( ); Cobj.A:f(); Cobj.B:f( ); ,调用C类的f(),调用A的f(),调用B的f(),也就是从类A继承的f(),2019/4/7,42,2. 基类对象的初始化 在建立一个类等级后,通常是通过创建某个派生类的对象来使用这个类等级,包含隐含地使用基类的数据和函数,但是,基类往往有构造函数或有带参数的构造函数。 当创建一个派生类对象时,显然,需要提供一种初始化机制使得派生类对象在创建时,能够通过访问基类的构造函数来初始化基类的数据。 C+在派生类的构造函数中提供这种初始化基类的机制.,在C+语言中,派生类构造函数的声明为: 派生类构造函数(变元表):基类(变元表),对象成员1(变元表),,对象成员n(变元表) ,基类的构造函数(多继承中有多个基类的构造函数),对象成员的初始化表,基类使用缺省构造函数或不带参数的构造函数,那么派生类构造函数声明中“:”后面的“基类(变元表)”一项可以省去,但是派生类构造函数执行时仍然隐含地调用基类的构造函数执行。,这个构造函数执行时仍遵循先兄长(基类),再客人(对象成员),后自己(派生类)的顺序。,#include class Base public: Base() cout“nBase createdn”; ; class D_class: public Base public: D_class() cout“nD_class created n; ;,下面这个例子显示了构造函数的执行顺序,先兄长,后自己 例 5-13,void main() D_class d; 程序输出: Base created D_class created,2019/4/7,45,先执行基类的构造函数,再执行派生类的构造函数。由于基类对派生类一无所知,虽然基类的初始化显然与派生类的初始化相分离,但它可能是派生类的先决条件。因此,初始化时先执行基类的初始化。 执行析构函数时,先执行派生类的析构函数,再执行基类的析构函数。原因是可理解的,对基类的破坏隐含了对派生类的破坏,所以派生类的析构函数必须先执行。,基类的构造函数先执行,这点很重要,分析下面的例子。 例 5-14 class Base int x; public: Base(int i): x(i) ; class Derived: public Base int a; public: Derived(int i): a(i* 10), Base(a) ;,Derived d(1); 时,d(1)将先引起基类构造函数base(a)的调用,这时传给构造函数的值a是未定义的,并不是将初始化的a值传给基类Base。,例 5-15 #include #include class Parent int private1, private2; public: Parent(int p1, int p2) private1=p1; private2=p2; int inc1() return +private1; int inc2() return +private2; void display() printf(“n private1=%d, private2=%d”, private1, private2); ;,class Derived: private Parent int private3; Parent private4; public: Derived(int p1,int p2,int p3,int p4,int p5): Parent(p1, p2),private4(p3, p4) private3=p5; int inc1() return Parent:inc1(); int inc3() return +private3; void display() Parent:display(); private4.Parent:display(); printf( “n private3=%dnn”, private3); ;,2019/4/7,48,void main() Derived_class1 d1(17,18,1,2,-5); d1.inc1(); d1.display(); 该程序输出: private1=18, private2=18 private1=1, private2=2 private3=-5 注意: 派生类的友元只能访问基类的保护段成员和公有段成员及派生类自己的所有成员。,2019/4/7,49,5.1.5 Point类继承的一个例子,例 5-16 图形的基本单元是屏幕上单个的点。可以用抽象点模拟屏幕上的物理像素,称为Point类。 关于 Point类,有两个基本的信息类型,一种信息描述了点在那里,另一种信息描述了点怎么样。两者之中,位置是基本的,没有位置,根本不可能有一个点。所有点都要含 有一个位置,可以从一个更基本的基类Location中派生一个子类Point。 在Location类中含有关于x和y坐标的信息。Point继承了Location中的任何东西,并加进了Point类所必需的新内容。,/point.h class Location protected: int x; int y; public: Location(int InitX,int InitY); int GetX(); int GetY(); ;,class Point: public Loction protected: int Visible; public: Point(int InitX, int InitY); void Show( ); void Hide( ); bool IsVisible( ); void MoveTo(int NewX, int NewY); ;,/point.cpp #inclide “point.h” #include Location : Location(int InitX, int InitY) x=InitX; y=InitY; int Location : GetX( ) return x; int Location : GetY( ) return y; Point : Point( int InitX, int InitY) : Location(InitX, InitY) Visible=false; ,void Point : Show( ) Visible=true; putpixel(x, y, getcolor(); void Point : Hide( ) Visible=false; putpixel(x, y, getbkcolor(); ,bool Point:IsVisible() return Visible; void Point:MoveTo(int NewX, int NewY) Hide(); x=NewX; y=NewY; Show();,Point类提供了一个数据Visible,表示点的状态,并给出了几个成员函数来访问点的信息:显示这个点Show(), 抹掉这个点Hide(), 得到这个点的状态信息IsVisble(),将这点从当前位置移到新的位置MoveTo(int NewX, int NewY). 在此基础上,派生出一个新类Circle,同时提供用于显示,隐藏,放大和缩小圆的函数。,2019/4/7,53,#include “point.h” class Circle : Point int Radius; public: Circle(int InitX,int InitY, int InitRadius); void Show(); void Hide(); void Expand(int ExpandBy); void MoveTo(int NewX, int NewY); void Contract(int ContractBy); ;,Circle :Circle(int InitX, int InitY, int InitR): Point(InitX, InitY) Radius=InitR; void Circle:Show() Visible=true; circle(x, y, Radius); void Cricle:Hide() unsigned int tempcolor; tempcolor = getcolor(); setcolor(getbkcolor(); Visible=false; circle(x, y, Radius); setcolor(tempcolor); ,void Circle:Expand(int ExpandBy) Hide(); Radius +=ExpandBy; if(Radius0) Radius=0; Show(); void Circle:Contract(int ContractBy) Expand(-ContractBy); ,void Circle:MoveTo(int NewX; int NewY) Hide(); x=NewX; y=NewY; Show(); ,void main() int graphdriver=DETECT; int graphmode; initgraph( ,2019/4/7,57,对于Circle类,虽然没有定义原心,但由于继承了Point类,使用时,当作圆来进行整体考虑,而不用去考虑圆心是如何定义的,就像只定义一个类Circle,它定义了圆心和半径一样。多继承如图。其中Location是Point的直接基类; Point是Circle的直接基类;Location是Circle的间接基类。,5.2 多继承,5.2.1 多继承的概念 例5-18 在上例中要求在圆内显示正文,应如何处理呢?,首先定义一个叫做Gmessage的新类,它从指定的x和y坐标开始显示一个字符串,在前面,已定义了一个称为Circle的类,它显示一个圆。 显然在圆内显示正文是一个新的类,称它为类Mcircle, Circle 既要显示圆,又要显示正文,它应同时具有类GMeessage和类Circle的特征 多派生关系如图,#include #include #include #include “point.h” class Circle : public Point protected: int Radius; public: Circle(int InitX, int InitY, int InitRadius); void Show(); ;,MCircle,GMessage,Circle,MCircle,Location,Point,Location,class Gmessage: public Location char *msg; / message to be displayed int font; / BGI font to use int field; / size of field for text scaling public: GMessage(int MsgX, int MsgY, int MsgFont, int FieldSize, char *Text); void Show(); ;,class MCircle : public Circle, public Gmessage public: MCircle(int McircX, int McircY, int McircRadius, int Font, char * Msg); void Show(); /show circle with message ;,Circle : Circle(int InitX, int InitY, int InitRadius): Point(InitX, InitY) Rdius=InitRadius; ,GMessage : GMessage(int MsgX, int MsgY, int MsgFont,int FieldSize, char * Text): Location(MsgX, MsgY) Font=MsgFont; /standard fonts defined in graph.h Field=FieldSize; /width of area in which to fit text msg=Text; /point at message ,void Circle:Show() Visble = true; circle(x, y, Radius); /draw the circle ,void GMessage : Show() int size=Field/(8* strlen(msg); /8 pixels per char settextjustify(CENTER_TEXT, CENTER_TEXT); /Centers in circle settextyle(Font, HORIZ_DIR,Si z e); outtextxy(x, y, msg); ,settexjustify(), settextyle(), outtextxy()库函数,它们的原型在graphics.h中。 settextjustify 为图形函数设置文本的对齐方式。 settextstyle 为图形输出设置当前的文本属性。 outtextxy 在指定位置显示一字符串。,MCircle : MCircle(int McircX, int McircY,int McircRadius, int Font, char * Msg) : Circle(McircX,McircY,McircRadius), GMessage(McircX, McircY, Font, 2 * McircRadius,

    注意事项

    本文(第5部分派生类.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开