火竞猜-最佳电子竞技竞猜网站
火竞猜

氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔驰g

admin admin ⋅ 2019-04-01 15:18:19

1. 多态性与虚函数

1.1 多态性的概念

C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂

多态的意思是指一个事物有多种形状。C++中,多态性是指具有不同功用的函数能够用同一个函数名,这样就能够用一个函数名调用不同内容的函数。在面向目标时,多态性为:向不同的目标发送同一个音讯,不同的目标会在接纳时发作不同的行为。函数的重载和运算符的重载都是多态现象。

多态性分为2类:静态多态性和动态多态性。函数重载和运算符重载都归于静态多态性。静态多样性的意思是:在程序编译时就能决议调用哪个函数。静态多态性是经过函数的重载完成的。动态多态性是在程序运转进程中才动态确认操作指针所针对的目标。动态多态性是经过虚函数完成的。

当一个基类被承继为不同的派生类时,各派生类能够运用尉氏气候与基类成员相同的成员名,如果在运转期间调用类目标的成员,会发作二义性问题。

C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂

例 1.11.1树立一Point类,包括数据成员x,y(坐我和情人标点)。以它为基类,派生出一个Circle(圆)类,其间添加了数据成员半径r,再以Circle类为直接基类,派生出一个圆柱体类Cylinder,其间添加数据成员高度h。要求编写程序,重载运算符“<<”和“>>”,使之能用于输出以上类目标。

#include

usin青云记黄海川免费阅览g namespace std;

class Point

{

public:

Point(float x妹妹去=0,f氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑gloat y=0);//有默许参数的结构函数

void setpoint(float,float);//设置坐标值

float getX() const {return x;}//常成员函数能够引证本类中的数据成员,但不能修正他们

float getY() const {return y;}

friend ostream & operator << (ostream &,const Point &);重载输出运算符

protected:

float x,y;

};

Point::Point(float a,float b)//Point的结构函数

{x=a;y=b;}

void setpoint(float a,float b)

{x=a;y=b;}

//重载运算符<<,使其能够输出点的坐标

ostream &operator做受 << (ostream &output, const Point &p)

{

output<<”[“<<<”.”<<<”]”<

return output;

}

class Circle: public Point //Circle是Point类的共用派生类

{

public:

Circle(float x=0,float y=0,float r=0);//声明结构函数

void serRadius(float);//设置半径

float getRadius() const;//读取半径

float area() mm4丢失暗码const;//核算圆面积

friend ostream &operator << (ostream &, const Circle &);

protected:

float radius;

};

Circl女明星胸e::Circle(float a,float b,float r):Point(a,b)//界说结构函数,对圆心坐标和半径进行初始化黛欣燃

{radius=r;}

void Cirecle::setRadius(float r)

{radius=r;}

float Circle::getRadius() const

{return radius;}

float Circle::area() const

{return 3.14159*rad展业达人钱包ius*radius;}

ostream &operator <<(ostream &output,const Circle &c)

{

output<<”Center=[“<<<”.”<<<”],r=”<<<”,area=”<<

return output;

};

class Cylinder:public Circle //Cylinder是Circle的共用派生类

{

public:

Cylinder(float x=0,float y=0,蔡金涂float r=0,float h=0);//结构函数

void setHeight(float);//设置圆柱高度

float getHeight() const;//读取圆柱高度

float area() const;//核算圆柱表面积

float volume() const;//核算圆柱体积

friend ostream& operator << (ostream&, const Cylinder&);

protected:

float height;

};

Cylinder::Cylinder(float a,float b,float r,float h):Circle(a,b,r)//界说结构函数

{height=h;}

void Cylinder::setHeight(float 等腰三角形悖论h)

{heigh爱之奇观t=h;}

float Cylinder::getHeight() const

{return南山南背面的恐惧故事 height;}

float C氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑gylinder::area() const

{return 2*Circle::area()+2*3.14159氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑g*radius*height;}

float Cylinder::volume() const

{return Circle::area()*height;

ostream &operator << (ostream &output,const Cylinder &cy)

{ output<<”Center=[“<<<”,”<<<”],r=”<<<”,h=”<<<”\narea= “<<<” ,volume=”<<

return output;

}

int main()

{

Cylinder cy1(3.5,6.4,5.2,10);//界说Cylinder类目标cy1

cout<<”\noriginal cylinder: \nx=”<<<” ,y=”<<<” ,r”=cy1.getRadius() <<” ,h=”<<<”\narea=”<<<” ,volume=”<<

//Cylinder类中也界说了area函数,发作同名掩盖

cy1.setHeight(15);

cy1.setRadius(7.5);

cy1.setPoint(5,5);

cout<<”\nnew cylinder: \n”<<<输出cy1的数据>

Point &Ref=cy1;//pRef是Point类目标的氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑g引证

cout<<”\npRef as a Point:”<

Circle &cRef=cy1; //cRef是Circle类目标的引证

cout<<”\ncRef as a Circle:”<

return 0;

}

1.2 虚函数

一、虚函数的效果

在类的承继层次结构中,不同的层次中能够呈现姓名相同,参数个数和类型都相同而功用不同的函数。如例1.11.1中Circle类的area函数和Circle派生类Cylinder中的area函数,它们姓名相同,参数个数均为0,可是功用不同。会发作同名掩盖。能否调用同一个方式,既能调用派生类又能调用基类的同名函数。C++供给了虚函数来处理上述中的同名掩盖问题。

简略地说,那些被关键字virtual声明的成员函数便是虚函数。虚函数的效果是答应在派生类中从头界说与基类同名的的函数,并能够经过堆集指针或引证来访问基类和派生类中的同名函数。

虚函数方式:

在基类声明函数时,在最左边加一个关键字萱野可芳virtual。且当一个成员函数被声明为虚函数时,其派生类的同名成员函数主动成为虚函数。

Eg:

class Student

{public:

virtual void display();//在声明基类时,将成员函数声明为虚函数

};

class Graduate: publdnfcd称谓i陈长芹c Student

{

public:

void display();

};

int main()

{

Student stud1;

Graduate grad1;

Student *p;//p是一个基类指针,能够调用同一类族中不同类的虚函数

p=&stud小姐威客官网1;

(*p).display();

p=&grad1;

(*p).display();

}

用同一个基类指针变量,能够调用同一组类中的不同虚函数。原本基类指针是用来指向派生类目标中的基类部分的,无法经过基类指针调用派生类目标的中的成氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑g员函数的。虚基类突破了这一约束,在派生类的基类部分中,派生类的虚函数替代了基类本来的虚函数,因而当堆集指针指向派生类目标后,调用虚函数时就调用了派生类的虚函数。虚函数的运用方法为:、

① 在基类顶用virtual声明成员函数为虚函数,这样就能够在派生类中从头界说此函数,为它赋予新的功用,并能便利的调用。

② 在派生类中从头界说此函数,要求函数名,函数类型,函数参数个数和类型悉数与基类的虚函数相同,并依据派生类的需求从头界说函数体。

③ 界说一个指向基类目标的指针变量,并使它指向同一类族中需求调用该函数的目标。

④ 经过指针变量调用此虚函数,此刻调用的便是指针变量所指向的目标的同名函数。

经过虚函数与指向基类目标的指针变量的合作运用,就能便利地调用同一类族中不同类的同名函数。

1.3 静态相关与动态相关

确认调用8k90w的详细目标的进程称为相关,在这里指的是把一个函数名与一个类目标均绑在一同。函数重载和经过目标名调用的虚函数在编译时即可确认其调用的虚函数归于那一个类,其进程称为静态相关。如果是经过指针调用虚函数,氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑g则是在运转阶段把把虚函数和类目标绑缚在一同,因而称为动态相关。

留意:①只能用virtual声明类的成员函数,使它成为虚函数;②一个成员函数被声明为虚函数后,在同一类族中不能呈现与之具有相同参数和回来值的同名函数。

1.4 纯虚函数与笼统类

一、纯虚函数

在例1.11.1中,Poi氩弧焊,C++及数据结构温习笔记,多态性与虚函数很难吗?几分钟就能弄懂,奔跑gnt类中没有area函数,可是Circle和Cylinder类中都有area函数,此刻应当将area声明为虚函数,以防止二义性。。如果在Point类中加一个area函数并将其声明为虚函数的话:

virtual float area() const {return 0;}

简化为:

virtual float area() const =0;

这就将area声明为一个纯虚函数。纯虚函数是在声明虚函数时被初始化为0的函数。其一般方式为:

virtual 函数类型 函数名(参数列表) =0;

纯虚函数的效果是在基类中为其派生类保存一个函数的姓名,以便派生类依据需求对它进行界说。需求留意的是:纯虚函数没有函数体;最终面的”=0”不表明回来0,仅仅起提示这是纯虚刘殊被检查函数的效果;纯虚函数不具备函数功用,不能被调用。包括纯虚函数的类是无法树立目标的。

二、笼统类

这种不用来界说目标而只作为一种根本类型用于承继的类,成为笼统类。因为它常用作基类,又称为笼统基类。但凡包括纯虚函数的类都是笼统类。