《《c程序设计基础》第八章-继承和派生.ppt》由会员分享,可在线阅读,更多相关《《c程序设计基础》第八章-继承和派生.ppt(106页珍藏版)》请在三一办公上搜索。
1、C+程序设计基础,第8章 继承与派生北京邮电大学信通院方莉,2,第8章 继承与派生,类具有封装性、继承性和多态性,使得软件开发者可以把类设计成相对独立的模块,像一个个积木块,便于重用。类的继承性是实现软件重用的一种重要形式。本章将学习:继承和派生的概念,继承方式;派生类的构造函数和析构函数;,3,第8章 继承与派生,8.1 继承的概念8.2 定义基类和派生类8.3 构造函数和析构函数8.4 转换与继承,4,8.1 继承的概念-例子,自行车Bicycle,山地车 Mountain Bike,竞速自行车 Racing Bike,双人自行车 Tandem Bike,5,8.1 继承的概念-例子,山地
2、车继承了自行车的特征山地车“派生”于 自行车,6,8.1 继承的概念,类的继承是在现有类的基础之上,创建新类的机制。称现有的类为基类,新建立的类为派生类。派生类继承了基类的属性和行为派生类是基类的特殊情况。基类是共性的抽象,派生类是个性的体现。不必从“草稿”开始创建特殊的程序对象。继承是处理“特殊情况”的面向对象编程机制。,7,8.1 继承的概念,8,第8章 继承与派生,8.1 继承的概念8.2 定义基类和派生类8.3 构造函数和析构函数8.4 转换与继承,9,8.2 定义基类和派生类,定义派生类时要声明继承方式,三种继承方式:publicProtectedprivate 访问控制受继承方式的
3、影响;不同继承方式的影响主要体现在:派生类成员对基类成员的访问控制;派生类对象对基类成员的访问控制;继承导致一种特殊的语法现象:同名覆盖。,10,8.2.1 简单的继承和派生,问题:想在屏幕上画出正三角形、矩形或圆形方法一:结构化方法DrawTri(int x,int y,char color,int side);DrawRect(int x,int y,char color,int length,int width)DrawCircle(int x,int y,char color,int Radius)方法二:面向对象?class circle 圆形class rectangle 矩形cl
4、ass triangle 三角形基类:class shape色彩 color位置(x,y),泛化?,11,图形circle 圆形rectangle 矩形triangle 三角形,基类称为父类派生类称为子类,分层次的设计类使模块划分更合理;便于软件系统的设计和维护。,8.2.1 简单的继承和派生,12,class Shapeprivate:int m_x,m_y;/位置 char m_color;/颜色public:Shape();void setposition(int x,int y);void setcolor(char color);int getx();int gety();char
5、getcolor();,例1-定义基类shape,成员函数的分类:构造函数设置属性值读取属性值,13,class Triangle:public Shape public:Triangle(int x,int y,char color=R,float slen=1);float GetSideLength()const;void SetTriangle(int x,int y,char color,float slen);void Draw();private:float m_SideLength;,例1-定义派生类(等边三角形类),成员函数的分类:构造函数设置属性值读取属性值,14,派生类的
6、定义格式class 派生类名:继承方式 基类名 public:/派生类公有成员 private:/派生类私有成员,派生类只有一个直接基类为单继承,8.2.2 定义派生类,15,class 派生类名:继承方式 基类名1,继承方式 基类名n public:/派生类公有成员 private:/派生类私有成员,有多个基类,派生类有多个基类为多继承,8.2.2 定义派生类,16,例如:已有基类b1和b2,定义派生类derive,其中包括:私有整型成员 newInt,公有函数成员 int newFun(),私有函数成员 int max(int a,int b);写出类derive的定义,8.2.2 定义派
7、生类,class derive:public b1,private b2private:int newInt;public:void newFun();private:int max(int a,int b);,17,类的继承方式是派生类对基类成员的继承方式。类的继承方式影响类外模块对于派生类从基类继承来的成员的访问权限。每一个“继承方式”,只用于限制对紧随其后之基类的继承。,class derive:public b1,private b2private:int newInt;public:void newFun();private:int max(int a,int b);,8.2.2 定
8、义派生类,18,class base;class deriver1:public base;class deriver2:public deriver1,父类被称为子类的直接基类 父类的父类或更高层次的父类被称为这个子类的间接基类,8.2.2 定义派生类,19,class Shape:public:Shape(int x=0,int y=0,char c=R);int GetX()const;void SetX(int x);int GetY()const;void SetY(int x);char GetColor()const;void SetColor(char c);protected
9、:char m_color;int m_x;int m_y;,例2-图形类及其派生类的声明,20,class Circle:public Shape public:Circle(int x,int y,float r=1,char color=R);void SetCircle(int x,int y,float r,char color);float GetRadius()const;void Draw();private:float m_Radius;,例2-图形类及其派生类的声明,21,class Triangle:public Shape public:Triangle(int x,i
10、nt y,char color=R,float slen=1);void SetTriangle(int x,int y,char color,float slen);float GetSideLength()const;void Draw();private:float m_SideLength;,例2-图形类及其派生类的声明,22,class Rectangle:public Shapepublic:Rectangle(int x,int y,char color,int length=10,int width=10);void SetRectangle(int x,int y,char
11、color,int length,int width);int GetWidth()const;int GetHeight()const;void Draw();private:int m_Width;int m_Length;,例2-图形类及其派生类的声明,23,派生类的成员包括:(1)继承基类的成员,(2)派生类定义时声明的成员。派生类自己增加的成员,完成两个需求:(1)修改基类成员,(2)描述新的特征或方法。,从基类继承的成员,派生类增加的成员,24,8.2.3 访问控制和继承关系,类成员的可见性公共成员:public保护成员:protected私有成员:private继承的方式公有继承
12、(public)保护继承(protected)私有继承(private)派生类继承了基类中的所有成员,但不包括构造函数析构函数,25,8.2.3 访问控制和继承关系,不同继承方式决定的不同访问控制权限体现在:派生类的成员函数对其继承的基类成员的访问控制;其它模块通过派生类对象对其继承的基类成员的访问控制。,继承来的成员的访问权限?,26,1.公有继承,公有继承的派生类定义形式:class 派生类名:public 基类名派生类新成员定义;;,基类成员 在派生类中的访问属性不变。派生类的成员函数 可以访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数 可以通过派生类的对象,
13、访问从基类继承的公有成员,但不能访问从基类继承的保护成员和私有成员。,派生类成员函数可以访问,27,public是定义公有继承方式的关键字。公有继承方式定义的派生类,继承了基类中除构造函数和析构函数外的其余成员:公有成员、保护成员和私有成员被继承的基类成员在派生类中仍将保持其原来的访问属性。派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数可以通过派生类的对象,访问从基类继承的公有成员,但不能访问从基类继承的保护成员和私有成员。,8.2.3 访问控制和继承关系,28,class Point/基类Point类的定义public:/公有函数成员void
14、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;,8.2.3 访问控制和继承关系,29,class Rectangle:public Point/派生类声明部分public:/新增公有函数成员void InitR(float x,float y,float w,float h)InitP(x,y);/?访问基类公有成员函数 W=w;H=h;
15、float GetH()return H;float GetW()return W;private:/新增私有数据成员float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,30,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 只能访问基类的public成员,8.2.3 访问控制和继承关系,错误,正确,31,class Rectangle:public Point/派生类声明部分public:/新增公有
16、函数成员void InitR(float x,float y,float w,float h)X=x;Y=y;/?访问基类私有成员 W=w;H=h;float GetH()return H;float GetW()return W;private:/新增私有数据成员float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,错误,32,class Point/基类Point类的定义public:void InitP(float xx=0,float yy=0)X=xx;Y=yy;vo
17、id Move(float xOff,float yOff)X+=xOff;Y+=yOff;float GetX()return X;float GetY()return Y;protected:float X,Y;,8.2.3 访问控制和继承关系,33,class Rectangle:public Point/派生类声明部分public:/新增公有函数成员void InitR(float x,float y,float w,float h)X=x;Y=y;/?访问基类的保护成员 W=w;H=h;float GetH()return H;float GetW()return W;private
18、:/新增私有数据成员float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,正确,34,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 只能访问基类的public成员,依然错误!,8.2.3 访问控制和继承关系,正确,35,2.私有继承,私有继承的派生类定义形式:class 派生类名:private 基类名派生类新成员定义;;,基类成员:在派生类中的访问属性都变成 private。派生类的成员函数:可以
19、访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数:不能通过派生类的对象,访问从基类继承的任何成员。,派生类成员函数可以访问,36,private是定义私有继承方式的关键字以私有继承方式定义的派生类,继承了基类中可以继承的成员:公有成员、保护成员和私有成员,这些成员在派生类中的访问属性都是私有的。派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员。派生类以外的其它函数则不能通过派生类的对象访问从基类继承的任何成员。,8.2.3 访问控制和继承关系,37,class Point/基类声明public:void InitP(float xx=0,flo
20、at 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;,8.2.3 访问控制和继承关系,38,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 yOf
21、f)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,正确,39,class Rectangle:private Point/派生类声明public:/新增外部接口void InitR(flo
22、at x,float y,float w,float h)X=x;Y=y;/?W=w;H=h;void Move(float xOff,float yOff)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问
23、控制和继承关系,错误,40,class 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;protected:float X,Y;,8.2.3 访问控制和继承关系,41,class Rectangle:private Point/派生类声明public:/新增外部接口void InitR(float x,float y,float w,float
24、h)X=x;Y=y;/?W=w;H=h;void Move(float xOff,float yOff)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,8.2.3 访问控制和继承关系,正确,42,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 不能访问基类中的任
25、何成员。,8.2.3 访问控制和继承关系,错误,错误,43,3.保护继承,保护继承的派生类定义形式:class 派生类名:protected 基类名派生类新成员定义;;,基类成员:公有成员和保护成员在派生类中变成保护类型的,基类的私有成员属性不变。派生类的成员函数:可以访问基类的公有成员和保护成员,不能访问基类的私有成员;派生类以外的其它函数:不能通过派生类的对象,访问从基类继承的任何成员。,派生类成员函数可以访问,44,protected是定义保护继承方式的关键字以保护继承方式定义的派生类,继承了基类中可以继承的成员:公有成员、保护成员和私有成员。其中基类的公有成员和保护成员在派生类中访问控
26、制属性变成保护类型的,基类的私有成员保持原来属性。派生类的成员函数可以访问基类的公有成员和保护成员,不能访问基类的私有成员。派生类以外的其它函数则不能通过派生类的对象访问从基类继承的任何成员。,8.2.3 访问控制和继承关系,45,class 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;,8.2.3 访问控
27、制和继承关系,46,class Rectangle:protected 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);float GetX()return Point:GetX();float GetY()return Point:GetY();float GetH()return H;float GetW()return W;priv
28、ate:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,正确,47,class Rectangle:protected Point/派生类声明public:/新增外部接口void InitR(float x,float y,float w,float h)X=x;Y=y;/?W=w;H=h;void Move(float xOff,float yOff)Point:Move(xOff,yOff);float GetX()return Point:GetX()
29、;float GetY()return Point:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,错误,48,class Point/基类声明public:void InitP(float xx=0,float yy=0)X=xx;Y=yy;void Move(float xOff,float yOff)X+=xOff;Y+=yOff;floa
30、t GetX()return X;float GetY()return Y;protected:float X,Y;,8.2.3 访问控制和继承关系,49,class Rectangle:protected Point/派生类声明public:/新增外部接口void InitR(float x,float y,float w,float h)X=x;Y=y;/?W=w;H=h;void Move(float xOff,float yOff)Point:Move(xOff,yOff);float GetX()return Point:GetX();float GetY()return Point
31、:GetY();float GetH()return H;float GetW()return W;private:/新增私有数据float W,H;,派生类中的 成员函数 可以直接访问基类中的public和protected成员,但不能访问基类的private成员。,8.2.3 访问控制和继承关系,正确,50,main()Rectangle rect;coutrect.X;/?coutrect.GetX();/?,使用派生类的 对象 不能访问基类中的任何成员。,8.2.3 访问控制和继承关系,错误,错误,51,私有继承和保护继承的区别,孙类成员函数无法访问,孙类成员函数可以访问,52,8.2
32、.3 访问控制和继承关系,53,派生类修改基类的成员,是在派生类中声明了一个与基类成员同名的新成员。在派生类作用域内或者在类外通过派生类的对象直接使用这个成员名,只能访问到派生类中声明的同名新成员,这个新成员覆盖了从基类继承的同名成员,这种情况称为同名覆盖。,8.2.4 同名覆盖,54,class base public:void f()coutbaseendl;class deriver:public base public:void f()coutderiverendl;int main()deriver derobj;derobj.f();return 0;,输出结果?A:baseB:d
33、eriver,OverRide,8.2.4 同名覆盖,55,同名覆盖示例,#includeusing namespace std;class base public:void function()coutfunction of class baseendl;class deriver:public base public:void function()coutfunction of class deriverendl;,同名的新成员。同名覆盖。,56,void main()deriver derobj;derobj.function();输出结果:function of class deriv
34、er,同名覆盖示例,57,第8章 继承与派生,8.1 继承的概念8.2 定义基类和派生类8.3 构造函数和析构函数8.4 转换与继承,58,8.3 派生类构造函数和析构函数,派生类继承了基类中除构造函数和析构函数之外的所有成员。基类的构造函数和析构函数不能被派生类所继承;派生类一般需要定义自己的构造函数和析构函数;派生类的构造及析构函数通常会受到基类构造及析构函数的影响。,59,8.3.1 基类只有无参数的构造函数,在基类具有无参构造函数,派生类又没有定义构造函数的时候,系统会自动的调用基类无参构造函数,来构造派生类对象中的基类成分。,60,#includeusing namespace st
35、d;class base private:int m_data;public:void SetData(int data)m_data=data;int GetData()return m_data;,使用系统提供的默认构造函数,61,class deriver:public baseprivate:int m_member;public:void SetMember(int m)m_member=m;int GetMember()return m_member;,使用系统提供的默认构造函数,62,void main()int n(10);deriver obj;obj.SetMember(n
36、);coutobj.GetMember()endl;输出结果:10,使用系统提供的默认构造函数,63,8.3.1 基类只有无参数的构造函数,如果基类没有无参构造函数,派生类也不定义自己的构造函数,在编译的时候,一定会有语法错误。,64,如果基类和对象数据成员的构造函数都无参数,派生类构造函数形参表中将只包含用于初始化它自己的基本类型数据成员的参数。如果这个派生类恰好没有基本类型的数据成员,则其构造函数的形参表为空,可以不定义构造函数,而使用系统提供的默认构造函数。,8.3.1 基类只有无参数的构造函数,65,8.3.2 派生类的构造函数,不参与继承的特殊函数构造函数析构函数作为特权地位的友元函
37、数赋值运算符函数派生类需要自己定义的构造函数和析构函数。,66,基类的构造函数不被继承,需要在派生类中自行定义。派生类的构造函数完成:初始化本类的数据成员;完成派生类中基类成分的初始化:通过调用基类的构造函数,并为基类的构造函数传递参数;如果数据成员有对象,则需调用对象成员的构造函数;,8.3.2 派生类的构造函数,67,派生类的构造函数:构造函数参数表中以合适的初值为参数,初始化本类中新增成员。利用成员初始化表隐含调用基类和新增对象数据成员的构造函数,初始化它们各自的数据成员。构造函数的调用次序系统会使用派生类构造函数的形参表的参数调用基类和内嵌对象成员的构造函数。,8.3.2 派生类的构造
38、函数,68,派生类构造函数的一般形式:派生类名:派生类名(基类所需的形参,本类成员所需的形参):基类1(基类参数表1),基类n(基类参数表n),对象成员1(对象参数表1),对象成员m(对象参数表m)本类基本类型数据成员初始化;,8.3.2 派生类构造函数,69,单继承时的构造函数 派生类名:派生类名(基类所需的形参,本类成员所需的形参):基类名(参数)本类成员初始化赋值语句;,8.3.2 派生类构造函数,70,例8-4 单继承派生类构造函数,71,多文件结构:主函数:ch8_4_main().cpp类TShape的声明:TShape04.h类TShape的实现:TShape04.cpp类TEl
39、lipse的声明:TEllipse04.h类TEllipse的实现:TEllipse04.cpp,例8-4 单继承派生类构造函数,72,/TShape04.cpp#include TShape04.h#include TShape:TShape(uint x,uint y)_x=x;_y=y;void TShape:Draw()std:coutThis is TShape:Draw()std:endl;void TShape:getXY(uint,/TShape04.htypedef unsigned int uint;typedef unsigned char uchar;class TSh
40、apeprivate:uint _x,_y;/几何形状的位置protected:/*声明几何形状的颜色。允许TShape的派生类直接访问这些颜色属性,而不允许在类外通过类的对象直接访问这些属性*/uchar _RED,_GREEN,_BLUE;public:TShape(uint x,uint y);void getXY(uint,例8-4 单继承派生类构造函数,73,/TEllipse04.cpp#include TEllipse04.h#include TEllipse:TEllipse(uint longR,uint shortR,uint x,uint y):TShape(x,y)_l
41、ongR=longR;_shortR=shortR;/在派生类构造函数中初始化基类保护成员 _RED=0 x00;_GREEN=0 x00;_BLUE=0 x00;TEllipse:TEllipse()void TEllipse:Draw()uint x,y;getXY(x,y);/调用基类函数获取椭圆的圆心坐标 std:cout(_RED)(_GREEN)(_BLUE)at point(;/std:cout_x,_y)std:endl;/错误!在派生类中不能访问基类私有成员 std:cout x,y)std:endl;,/TEllipse04.h#include TShape04.hclas
42、s TEllipse:public TShape protected:uint _longR,_shortR;public:TEllipse(uint longR,uint shortR,uint x,uint y);TEllipse();void Draw();void getR(uint,例8-4 单继承派生类构造函数,74,/ch8_4_main.cpp#includeTEllipse04.h#includeusing namespace std;void main()TEllipse elps(10u,5u,20u,30u);elps.setRGB(0 x00,0 x00,0 xff)
43、;/调用基类的函数访问基类的保护成员/elps._RED=0 x10;/错误,不能通过派生类的对象调用基类的私有成员 elps.Draw();/调用派生类的Draw函数,例8-4 单继承派生类构造函数,75,派生类名:派生类名(基类所需形参,本类成员所需形参):基类1(基类参数表1),基类n(基类参数表n),对象成员1(对象参数表1),对象成员m(对象参数表m)本类基本类型数据成员初始化;,包含内嵌对象的派生类构造函数,76,派生类的构造函数提供:基类构造函数形参表所需的参数初始化派生类的内嵌对象数据成员所需的参数初始化派生类基本数据类型成员所需的参数将例8-4中的颜色抽取形成一个新类TCol
44、or,用TColor类的对象作为TShape类中的数据成员,重新设计程序。,包含内嵌对象的派生类构造函数,77,例8-5 派生类的构造函数,78,多文件结构:主函数:ch8_5_main().cpp类TColor的声明:TColor 05.h类TColor的实现:TColor 05.cpp类TShape的声明:TShape05.h类TShape的实现:TShape05.cpp类TEllipse的声明:TEllipse05.h类TEllipse的实现:TEllipse05.cpp头文件GlobalType05.h,例8-5 派生类的构造函数,79,/TShape05.h#pragma once#
45、include GlobalType05.h#include TColor05.hclass TShapeprivate:uint _x,_y;/几何形状的位置protected:TColor _color;/颜色public:TShape(uint x,uint y);TShape(uint x,uint y,TColor color);TShape();void getXY(uint,/GlobalType05.h#pragma once/预处理指令,避免重复包含本头文件typedef unsigned int uint;typedef unsigned char uchar;/TColo
46、r05.h#pragma once#include GlobalType05.henum EColorComponent RED,GREEN,BLUE;class TColorprivate:uchar _RED,_GREEN,_BLUE;public:TColor(const uchar R=0 x00,const uchar G=0 x00,const uchar B=0 x00);/普通构造函数 TColor(const TColor,例8-5 派生类的构造函数,80,/TColor05.cpp#include TColor05.hTColor:TColor(uchar R/*=0 x0
47、0*/,/普通构造函数 uchar G/*=0 x00*/,uchar B/*=0 x00*/)_RED=R;_GREEN=G;_BLUE=B;TColor:TColor(const TColor,/TEllipse.h#pragma once#include TShape05.h#include GlobalType05.hclass TEllipse:public TShape protected:uint _longR,_shortR;public:TEllipse(uint longR,uint shortR,uint x,uint y,TColor color);TEllipse(u
48、int longR,uint shortR,uint x,uint y);TEllipse();void Draw();void getR(uint,例8-5 派生类的构造函数,81,void TShape:getXY(uint,/TShape05.cpp#include TShape05.h#include TColor05.h#include TShape:TShape(uint x,uint y):_color()_x=x;_y=y;TShape:TShape(uint x,uint y,TColor color)_x=x;_y=y;_color=color;void TShape:Dr
49、aw()uint R,G,B;R=static_cast(_color.getComponent(RED);G=static_cast(_color.getComponent(GREEN);B=static_cast(_color.getComponent(BLUE);std:coutDraw an shape with color(;std:coutR,G,B)at point(;std:cout _x,_y)std:endl;,例8-5 派生类的构造函数,82,/TEllipse05.cpp#include TEllipse05.h#include TEllipse:TEllipse(ui
50、nt longR,uint shortR,uint x,uint y,TColor color):TShape(x,y)_longR=longR;_shortR=shortR;_color=color;TEllipse:TEllipse(uint longR,uint shortR,uint x,uint y):TShape(x,y)_longR=longR;_shortR=shortR;TEllipse:TEllipse()void TEllipse:Draw()uint x,y;getXY(x,y);/调用基类函数获取椭圆的圆心坐标uint R,G,B;R=static_cast(_col