●●● ●●●●● 第13讲多态 ●●● 友员函数 ●多态性与虚函数 ●纯虚函数和抽象类
第13讲 多态 ⚫ 友员函数 ⚫ 多态性与虚函数 ⚫ 纯虚函数和抽象类
●●● ●●●●● 学习目标 ●●● ●掌握友元函数的定义和使用 ●理解多态的概念、多态性的分类 ●理解虚函数作用、什么情况下声明虚函数 ●理解纯虚函数、抽象类、虚析构函数的作用, 并掌握其使用 ●理解掌握动态多态性的实现
学习目标 ⚫ 掌握友元函数的定义和使用 ⚫ 理解多态的概念、多态性的分类 ⚫ 理解虚函数作用、什么情况下声明虚函数 ⚫ 理解纯虚函数、抽象类、虚析构函数的作用, 并掌握其使用 ⚫ 理解掌握动态多态性的实现
●●● ●●●●● 第12讲多态 ●●● 友员函数 ●多态性与虚函数 ●纯虚函数和抽象类
第12讲 多态 ⚫ 友员函数 ⚫ 多态性与虚函数 ⚫ 纯虚函数和抽象类
●●● ●●●●● 友元函数 ●●● 类中私有和保护的成员在类外不能被访问。 友元函数是一种定义在类外或类中的普通函数, 其特点是能够访问类中私有成员和保护成员,即 类的访问权限的限制对其不起作用。 友元函数不是成员函数,用法也与普通的函数完 全一致,只不过它能访问类中所有的数据。友元 函数破坏了类的封装性和隐蔽性,使得非成员函 数可以访问类的私有成员。 ●一个类的友元可以自由地用该类中的所有成员
友元函数 ⚫ 类中私有和保护的成员在类外不能被访问。 ⚫ 友元函数是一种定义在类外或类中的普通函数, 其特点是能够访问类中私有成员和保护成员,即 类的访问权限的限制对其不起作用。 ⚫ 友元函数不是成员函数,用法也与普通的函数完 全一致,只不过它能访问类中所有的数据。友元 函数破坏了类的封装性和隐蔽性,使得非成员函 数可以访问类的私有成员。 ⚫ 一个类的友元可以自由地用该类中的所有成员
友元函数需要在类体内进行说明,在前面加 上关键字 friend。 般格式为: friend FuncName(args>); 函数名 friend float volume(a &a); 关键字返回值类型 函数参数
第一章 VC集成开发 环境 5 友元函数需要在类体内进行说明,在前面加 上关键字friend。 一般格式为: friend FuncName(); friend float Volume(A &a); 关键字 返回值类型 函数名 函数参数
有关友元函数的使用,说明如下: 友元函数不是类的成员函数 友元函数近似于普通的函数,它不带 有this指针,因此必须将对象名或对 象的引用作为友元函数的参数,这样 才能访问到对象的成员
第一章 VC集成开发 环境 6 有关友元函数的使用,说明如下: 友元函数不是类的成员函数 友元函数近似于普通的函数,它不带 有this指针,因此必须将对象名或对 象的引用作为友元函数的参数,这样 才能访问到对象的成员
class at float x, y; 友元函数只能用对象 public 名引用类中的数据。 A (float a, float b x=a;y=b; j 成员函数 float Sumo return x+y;3 friend float Sum(a &a return axa y, 3 友元函数 私有数据 void main(void) {A1(4,5)2(10,20);成员西数的调用,利用对象名调用 cout<<t1 Sum(<<endl; c0ut<sum(t2)≤endl 友元函数的调用,直接调用
第一章 VC集成开发 环境 7 class A{ float x,y; public: A(float a, float b){ x=a; y=b;} float Sum(){ return x+y; } friend float Sum(A &a){ return a.x+a.y; } }; void main(void) { A t1(4,5),t2(10,20); cout<<t1.Sum()<<endl; cout<<Sum(t2)<<endl; } 友元函数 成员函数 友元函数的调用,直接调用 成员函数的调用,利用对象名调用 友元函数只能用对象 名引用类中的数据。 私有数据
●●● ●●●●● 友元函数与一般函数的不同点 ●●● 友元函数必须在类的定义中说明,其函数体 可在类内定义,也可在类外定义; 它可以访问该类中的所有成员(公有的、私 有的和保护的),而一般函数只能访问类中 的公有成员
友元函数与一般函数的不同点 ⚫ 友元函数必须在类的定义中说明,其函数体 可在类内定义,也可在类外定义; ⚫ 它可以访问该类中的所有成员(公有的、私 有的和保护的),而一般函数只能访问类中 的公有成员
class a float x, y public: A (float a, float b) x=a; y=b; 3 float Getxoi return x;) float Getyoi return y;}成员函数 float Sumo return X+y; friend float Sum(a &) 友元函数 普通函数,必须通过公有函数访问私有成员 float Sumxy(a &ai return a Getx(+a. Getyo; j float Sum(a &a) return a xtay;A void main(void) 友元函数,可以直接调用类中私有成员 Atl(1,2,t2(10,20),t3(100200) cout<<tl Sumo<<endl; 对象调用成员函数 cout<<Sum(t2)<<endl 调用友元函数 cout<<sumxy3) <endl;;、调用一般函数
9 class A{ float x,y; public: A(float a, float b){ x=a; y=b;} float Getx(){ return x; } float Gety(){ return y; } float Sum(){ return x+y; } friend float Sum(A &); }; float Sumxy(A &a){ return a.Getx()+a.Gety(); } float Sum(A &a){ return a.x+a.y; } void main(void) { A t1(1,2),t2(10,20), t3(100,200); cout<<t1.Sum()<<endl; cout<<Sum(t2)<<endl; cout<<Sumxy(t3)<<endl; } 成员函数 友元函数,可以直接调用类中私有成员 普通函数,必须通过公有函数访问私有成员 对象调用成员函数 调用友元函数 调用一般函数 友元函数
●●● ●●●●● 友元函数 ●●● 友元函数不受类中访问权限关键字的限制,可 以把它放在类的私有部分,放在类的公有部分 或放在类的保护部分,其作用都是一样的。换 言之,在类中对友元函数指定访问权限是不起 作用的。 ●友元函数的作用域与一般函数的作用域相同。 ●谨慎使用友元函数 ●通常使用友元函数来取对象中的数据成员值, 而不修改对象中的成员值,则肯定是安全的
友元函数 ⚫ 友元函数不受类中访问权限关键字的限制,可 以把它放在类的私有部分,放在类的公有部分 或放在类的保护部分,其作用都是一样的。换 言之,在类中对友元函数指定访问权限是不起 作用的。 ⚫ 友元函数的作用域与一般函数的作用域相同。 ⚫ 谨慎使用友元函数 ⚫ 通常使用友元函数来取对象中的数据成员值, 而不修改对象中的成员值,则肯定是安全的