C++高级语言程序设计第9章_第1页
C++高级语言程序设计第9章_第2页
C++高级语言程序设计第9章_第3页
C++高级语言程序设计第9章_第4页
C++高级语言程序设计第9章_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京邮电大学信息与通信工程学院2026/8/191C++高级语言程序设计第9章多态性

北京邮电大学信息与通信工程学院

北京邮电大学信息与通信工程学院多态性(Polymorphism)是面向对象程序设计的主要特征之一。多态性对于软件功能的扩展和软件重用都有重要的作用。是学习面向对象程序设计必须要掌握的主要内容之一。北京邮电大学信息与通信工程学院第九章多态9.1多态的概念9.2重载、覆盖于静态联编9.3虚函数与运行时多态9.4纯虚函数与抽象类9.5模板北京邮电大学信息与通信工程学院9.1多态的概念

北京邮电大学信息与通信工程学院2026/8/19-5-9.1.1面向对象程序设计中的多态总的来说,不同对象对于相同的消息有不同的响应,就是面向对象程序设计中的多态性。具体在程序中,多态性有两种表现的方式:同一个对象调用名字相同、但是参数不同的函数,表现出不同的行为。在同一个类中定义的重载函数的调用,属于这种情况。不同的对象调用名字和参数都相同的函数,表现出不同的行为。在派生类的应用中,经常会看到这样的调用。北京邮电大学信息与通信工程学院2026/8/19-6-9.1.1面向对象程序设计中的多态面向对象程序设计中多态性表现为以下几种形式:重载多态:通过调用相同名字的函数,表现出不同的行为。运算符重载也是一种重载多态。运行多态:通过基类的指针,调用不同派生类的同名函数,表现出不同的行为。许多面向对象程序设计的书籍中所说的多态性,就是这种多态。模板多态,也称为参数多态:通过一个模板,得到不同的函数或不同的类。这些函数或者类具有不同的特性和不同的行为。北京邮电大学信息与通信工程学院2026/8/19-7-9.1.2多态的实现:联编

一个具有多态性的程序语句,在执行的时候,必须确定究竟是调用哪一个函数。也就是说,在执行的时候调用哪个函数是唯一地确定的。确定具有多态性的语句究竟调用哪个函数的过程称为联编(Binding),有的资料也翻译成“绑定”。北京邮电大学信息与通信工程学院2026/8/19-8-9.1.2多态的实现:联编联编有两种方式:静态联编和动态联编。在源程序编译的时候就能确定具有多态性的语句调用哪个函数,称为静态联编。对于重载函数的调用就是在编译的时候确定具体调用哪个函数,所以是属于静态联编。北京邮电大学信息与通信工程学院2026/8/19-9-9.1.2多态的实现:联编动态联编则是必须在程序运行时,才能够确定具有多态性的语句究竟调用哪个函数。用动态联编实现的多态,也称为运行时的多态。以上所述的几种多态形式中,只有运行多态是属于动态联编。以后我们会看到,在一个循环中的同一个语句,第一次循环时调用的是一个函数,第二次循环时调用的是另一个函数。这种结果,程序不运行是看不到的。所以称为动态联编。北京邮电大学信息与通信工程学院9.2重载、覆盖与静态联编

北京邮电大学信息与通信工程学院2026/8/19-11-9.2.1重载与静态联编

以下是一个重载函数的例子。intadd(inta){returna+10;}intadd(inta,intb){returna+b;}intmain(){intx=1,y=2;add(x);add(x,y);return0;}北京邮电大学信息与通信工程学院2026/8/19-12-9.2.2覆盖与静态联编覆盖(Override)现象只能出现在继承树中。在派生类中定义和基类中同名的成员函数,是对基类进行改造,为派生类增加新的行为的一种常用的方法。在某些情况下,覆盖会导致静态联编;另外一些情况下,则会导致动态联编。北京邮电大学信息与通信工程学院2026/8/19-13-9.2.2覆盖与静态联编例9-1用对象访问继承树中的同名函数//以下代码仅为示例,无法编译classB{public:f(){…}}; //基类classP:publicB{public:f(){…}}; //派生类1classQ:publicB{public:f(){…}}; //派生类2main(){ Pp; Qq; //创建派生类对象 p.f(); //调用P::f() q.f(); //调用Q::f()北京邮电大学信息与通信工程学院2026/8/19-14-9.2.2覆盖与静态联编例9-2用指针访问继承树中的同名函数//以下代码仅为示例,无法编译classB{public:f(){…}}; //基类classP:publicB{public:f(){…}}; //派生类1classQ:publicB{public:f(){…}}; //派生类2main(){ B*b_ptr; Pp; Qq; //定义基类的指针和派生类的对象 b_ptr=&p; //基类指针指向派生类 b_ptr->f(); //通过基类指针调用B::f()

b_ptr=&q; //基类指针指向派生类 b_ptr->f(); //通过基类指针调用B::f()北京邮电大学信息与通信工程学院2026/8/19-15-9.2.2覆盖与静态联编北京邮电大学信息与通信工程学院9.3虚函数与运行时多态

北京邮电大学信息与通信工程学院2026/8/19-17-9.3虚函数与运行时多态在同名覆盖现象中,通过某个类的对象(对象指针、对象引用)调用同名函数,编译器会将该调用联编到该类的同名函数。通过基类对象指针(引用)是无法访问派生类普通函数的,即便这个指针(引用)是使用派生类对象初始化的。北京邮电大学信息与通信工程学院2026/8/19-18-9.3.1虚函数虚函数可以在类的定义中声明函数原型的时候来说明,格式如下:virtual<返回值类型>函数名(参数表);在函数原型中声明函数是虚函数后,具体定义这个函数时就不需要再说明它是虚函数了。如果在基类中直接定义同名函数,定义虚函数的格式是:virtual<返回值类型>函数名(参数表){<函数体>}北京邮电大学信息与通信工程学院2026/8/19-19-9.3.1虚函数基类中的同名函数声明或定义为虚函数后,派生类的同名函数无论是不是用virtual来说明,都将自动地成为虚函数。从程序可读性考虑,一般都会在这些函数的声明或定义时,用virtual来加以说明。只要对例11.2中的头文件稍加修改,也就是将基类和派生类中的getArea函数都声明为虚函数,在重新编译和运行程序,就可以得到运行时的多态的效果。北京邮电大学信息与通信工程学院2026/8/19-20-

例9-4用指针+虚函数的形式实现动态联编classB{public:virtualf(){}};classP:publicB{public:f(){}};classQ:publicB{public:f(){}};main(){B*b_ptr; Pp; Qq;b_ptr=&p;b_ptr->f(); //调用的是P::f()b_ptr=&q;b_ptr->f(); //调用的是Q::f()} //Shape类定义结束北京邮电大学信息与通信工程学院2026/8/19-21-

例9-5用引用+虚函数的形式实现动态联编classB{public:virtualf(){}};classP:publicB{public:f(){}};classQ:publicB{public:f(){}};main(){ Pp; Qq; B&b_ref1=p; b_ref.f(); //调用的是P::f() B&b_ref2=q; b_ref2.f(); //调用的是Q::f()}北京邮电大学信息与通信工程学院2026/8/19-22-9.3.1虚函数基类中的同名函数声明或定义为虚函数后,派生类的同名函数无论是不是用virtual来说明,都将自动地成为虚函数。从程序可读性考虑,一般都会在这些函数的声明或定义时,用virtual来加以说明。只要对例11.2中的头文件稍加修改,也就是将基类和派生类中的getArea函数都声明为虚函数,在重新编译和运行程序,就可以得到运行时的多态的效果。北京邮电大学信息与通信工程学院2026/8/19-23-9.3.1虚函数这个结果和例11.2的结果大不相同。同样的shape_ptr->getArea()函数调用,当shape_ptr指针中是Circle类对象地址时,访问的是Circle类的getArea函数。而shape_ptr指针中是Rectangle类对象的地址时,访问的是Rectangle类的getArea函数。这种方式的函数调用,在编译的时候是不能确定具体调用哪个函数的。只有程序运行后,才能知道指针shape_ptr中存放的是什么对象的地址,然后再决定调用哪个派生类的函数。是一种运行时决定的多态性。北京邮电大学信息与通信工程学院2026/8/19-24-9.3.1虚函数要实现运行时的多态,需要以下条件:必须通过指向基类对象的指针访问和基类成员函数同名的派生类成员函数;或者用派生类对象初始化的基类对象的引用访问和基类成员函数同名的派生类成员函数;派生类的继承方式必须是公有继承;基类中的同名成员函数必须定义为虚函数。北京邮电大学信息与通信工程学院2026/8/19-25-9.3.2虚析构函数如果用动态创建的派生类对象的地址初始化基类的指针,创建的过程不会有问题:仍然是先调用基类构造函数,再执行派生类构造函数。但是,在用delete运算符删除这个指针的时候,由于指针是指向基类的,通过静态联编,只会调用基类的析构函数,释放基类成员所占用的空间。而派生类成员所占用的空间将不会被释放。北京邮电大学信息与通信工程学院2026/8/19-26-9.3.2虚析构函数为了解决派生类对象释放不彻底的问题,必须将基类的析构函数定义为虚析构函数。格式是在析构函数的名字前添加virtual关键字。函数原型如下:

virtual~Shape();此时,无论派生类析构函数是不是用virtual来说明,也都是虚析构函数。再用deleteshape_ptr来释放基类指针时,就会通过动态联编调用派生类的析构函数。北京邮电大学信息与通信工程学院2026/8/19-27-9.3.2虚构虚函数例9-8在例9-6的基础上,修改main()函数,动态创建派生类对象并以该对象地址初始化基类指针,观察派生类对象销毁时的构造函数调用情况//例9-8只需修改程序例9-6中的main()即可,其它程序仅修改文件名//以及#include部分的文件名,其它代码不需改动。程序包含10个文件//Global08.h,TPoint08.h,TPoint08.cpp,TShape08.h,TRect08.h,//TCircle08.h,TCircle08.cpp,TEllipse08.h,TEllipse08.cpp//Main08.cpp

}北京邮电大学信息与通信工程学院2026/8/19-28-9.3.2虚构虚函数//修改后的Main08.cpp#include"Global08.h"#include"TPoint08.h"#include"TShape08.h"#include"TCircle08.h"#include"TEllipse08.h"#include"TRect08.h"intmain(){TShape*pShape=0;pShape=newTCircle(TPoint(1,1),10);pShape->Draw();deletepShape;pShape=newTEllipse(TPoint(-1,0),TPoint(1,0),4u);pShape->Draw();deletepShape;return0;}}北京邮电大学信息与通信工程学院2026/8/19-29-9.3.2虚构虚函数编译运行的输出结果如下:DrawaBLACKcirclewith:Center:(1,1)Radius:10TShapedestructed.DrawaBLACKellipsewith:Focus1:(-1,0)Focus2:(1,0)LongAxis:4TShapedestructed.请按任意键继续...}北京邮电大学信息与通信工程学院9.4纯虚函数与抽象类

北京邮电大学信息与通信工程学院2026/8/19-31-9.4纯虚函数与抽象类在前面的几个例子中,基类Shape本身并不是一个具体的“形状”的抽象,而是各种实际的“形状”的抽象。在C++中,对于那些在基类中不需要定义具体的行为的函数,可以定义为纯虚函数。

对于那些只是反映一类事物公共特性的类,在C++中可以定义为“抽象类”。北京邮电大学信息与通信工程学院2026/8/19-32-9.4纯虚函数与抽象类纯虚函数声明的格式是:

virtual<返回值类型>函数名(参数表)=0;纯虚函数的声明和使用有以下的特点:纯虚函数一定是在基类中声明的。在多级继承的情况下,纯虚函数除了在最高层基类中声明外,也可以在较低层的基类中声明。纯虚函数是没有函数体的。函数体是用“=0”来代替了。纯虚函数是不可以被调用的。凡是需要被调用的函数都不可以声明为纯虚函数。北京邮电大学信息与通信工程学院2026/8/19-33-9.4纯虚函数与抽象类抽象类的定义是基于纯虚函数的。凡是带有一个或几个纯虚函数的类,就是抽象类。抽象类定义的一般形式是: class类名 {public: virtual<返回值类型>函数名(参数表)=0; 其他函数的声明;

……. };北京邮电大学信息与通信工程学院2026/8/19-34-9.4纯虚函数与抽象类抽象类的定义和使用具有以下的特点:抽象类是不可以实例化的,也就是不可以定义抽象类的对象。但是,可以定义抽象类的指针和抽象类的引用。目的是通过这些指针或引用访问派生类的虚函数,实现运行时的多态。如果抽象类的派生类中没有具体实现纯虚函数的功能,这样的派生类仍然是抽象类。抽象类中除了纯虚函数外,还可以定义其他的非纯虚函数。北京邮电大学信息与通信工程学院2026/8/19-35-9.4纯虚函数与抽象类虚函数、纯虚函数、多态性在面向对象程序设计中有很大的作用。可以增强程序的通用性、可扩展性和灵活性。北京邮电大学信息与通信工程学院2026/8/19-36-

练习:

编写一个程序,可以动态的创建Circle类或者Rectangle类的对象,并且显示所创建对象的面积。在编程中注意使用多态性。

动态创建Circlae类或者Rectangle类对象动态创建Circlae类或者Rectangle类对象动态创建Circlae类或者Rectangle类对象希望用3个函数实现题目的功能。如果不使用运行时的多态,很难实现北京邮电大学信息与通信工程学院9.5模板

北京邮电大学信息与通信工程学院2026/8/19-38-9.5模板模板是C++中的通用程序模块。在这些程序模块中有一些数据类型是不具体的,或者说是抽象的。当这些抽象的数据类型更换为不同的具体数据类型以后,就会产生一系列具体的程序模块。C++中的模块包括函数模板和类模板。函数模板实例化后产生的函数,称为模板函数。类模板实例化后产生的类,称为模板类。北京邮电大学信息与通信工程学院2026/8/19-39-9.5.1函数模板函数模板定义的基本格式:template<typename参数化类型名>函数返回类型函数名(形式参数列表){函数体}“template”是定义模板的关键字。在一对尖括号<>内,关键字“typename”后面声明所使用的“参数化类型名”。关键字“typename”可以用“class”取代。北京邮电大学信息与通信工程学院2026/8/19-40-9.5.1函数模板模板的其余部分和一般的函数定义的格式完全相同。只是在函数定义时可以使用参数化类型来代表各种具体的数据类型。参数化类型可以用于:函数返回值类型;函数参数表内形式参数的类型;函数体内,自动变量的类型。北京邮电大学信息与通信工程学院2026/8/19-41-

例9-10函数模板的定义和使用:定义并使用“求3个数最大值”的函数模板。//Main10.cpp#include<iostream>usingstd::cout;usingstd::endl;template<typenameT>Tmax_value(Tx,Ty,Tz){ //函数模板的定义:求x、y、z的最大值

Ttemp;temp=x>y?x:y;returntemp>z?temp:z;}intmain(){cout<<max_value(12,32,21)<<endl; //用整数作实参调用函数模板

cout<<max_value('a','A','9')<<endl; //用字符作实参调用函数模板

return0;}程序执行后,输出: 32

a北京邮电大学信息与通信工程学院2026/8/19-42-9.5.1函数模板函数模板定义的一般格式

template<typename参数化类型名1,

………typename参数化类型名n>

函数返回类型函数名(形式参数列表){函数体}

北京邮电大学信息与通信工程学院2026/8/19-43-

例9-11编写一个函数模板,可以按指定的操作数类型进行乘法。//Main11.cpp#include<iostream>usingstd::cout;usingstd::endl;template<typenameP1,typenameP2>P1cal(P1x,P2y){ //函数模板有两个参数化类型名:P1和P2return(x*static_cast<P1>(y)); //按x的数据类型执行乘法}intmain(){unsignedshortw=230;shortz=150;cout<<cal(w,z)<<endl; //按无符号数相乘

cout<<cal(z,w)<<endl; //按有符号数相乘}北京邮电大学信息与通信工程学院2026/8/19-44-9.5.1函数模板带有确定类型的参数的函数模板函数模板的形式参数表中除了使用参数化类型名以外,还可以使用确定类型的参数。也就是说,函数模板的参数表中,一定要包含参数化类型名,但不一定都使用参数化类型名。还可以根据需要,使用确定类型的参数。如整型的参数、实型的参数,等等。北京邮电大学信息与通信工程学院2026/8/19-45-

例9-12设计和编写一个通用的输入数组元素的函数模板。可以用它来输入各种不同数据类型的数组。//例9-12。包含1个文件

Main12.cpp//Main12.cpp#include<iostream>#include<typeinfo>usingstd::cout;usingstd::cin;usingstd::endl;template<classQ1> //函数模板voidArrayInput(Q1array,intnum){cout<<"输入"<<num<<"个"<<typeid(Q1).name()<<'\b'<<"型数据"<<endl;for(intj=0;j<num;j++)cin>>array[j]; //输入数组元素}intmain(){intnumber;floatfloatArray[4];intintArray[3];number=sizeof(floatArray)/sizeof(float);ArrayInput(floatArray,number); //输入整型数组元素number=sizeof(intArray)/sizeof(int);ArrayInput(intArray,number);//输入浮点型数组元素return0;}北京邮电大学信息与通信工程学院2026/8/19-46-9.5.1函数模板程序中使用了C++所定义的typeid运算符。它可以在程序运行时,显示指定的数据的类型。使用的格式是:typeid(表达式).name()或者 typeid(类型标识符).name()为了符合一般的阅读习惯,在程序中通过输出一个“退格”符,将“*”覆盖了。最后看到的就是“输入X个XX型数据”。北京邮电大学信息与通信工程学院2026/8/19-47-9.5.2

函数模板使用中的问题

用户定义的类取代参数化类型:在这种情况下,函数模板实例化后,在函数的表达式中参与运算的就是类的对象。对象可以直接使用的运算符只有赋值运算符“=”。如果表达式中需要对象进行其他的运算,就必须在相应的类的定义中,对于要使用的运算符进行重载。例如,在例11.9中,函数模板是求3个实参的最大值,需要使用运算符“>”。如果要用对象来作实参,相应的类中要对“>”运算符进行重载。北京邮电大学信息与通信工程学院2026/8/19-48-

例9-13用例9-10的函数模板,求3个Circle类对象的最大值。#include<iostream>template<typenameT>Tmax_value(Tx,Ty,Tz){ //函数模板的定义:求x、y、z的最大值Ttemp;if(x>y)temp=x;elsetemp=y;if(z>temp)temp=z;returntemp;}classCircle { //Circle类的定义public://重载输出“<<”运算符,为了使该运算符能够访问Circle类的私有成员,//将该运算符声明为Circle的友元函数北京邮电大学信息与通信工程学院2026/8/19-49-

classCircle //Circle类的定义{public: friendostream&operator<<(ostream&,Circle&); //重载“<<”运算符

Circle(inta=0,intb=0,doublec=0.0) {x=a;y=b;radius=c; } intoperator>(Circlem2) //重载“>”运算符 {if(radius>m2.radius) return1; elsereturn0; }private: intx,y; //圆心座标

doubleradius; //圆半径}; //类Circle定义结束北京邮电大学信息与通信工程学院2026/8/19-50-

friendostream&operator<<(ostream&,Circle&);Circle(inta=0,intb=0,doublec=0.0){x=a;y=b;radius=c;}intoperator>(Circlem2){ //重载“>”运算符

if(radius>m2.radius)return1;elsereturn0;}private:intx,y; //圆心座标

doubleradius; //圆半径}; //类Circle定义结束北京邮电大学信息与通信工程学院2026/8/19-51-

ostream&operator<<(ostream&out,Circle&C1){out<<"x="<<C1.x<<"y="<<C1.y;out<<"radius="<<C1.radius;returnout;}intmain(){CircleC1(2,3,5),C2(3,5,8),C3(3,2,6); //定义3个Circle类对象

cout<<max_value(12,32,21)<<endl; //用整数作实参调用函数模板

cout<<max_value('a','A','9')<<endl; //用字符作实参调用函数模板

cout<<max_value(C1,C2,C3)<<endl; //用对象作参数调用函数模板}北京邮电大学信息与通信工程学院2026/8/19-52-9.5.2

函数模板使用中的问题函数模板不支持参数自动转换对于例9.10的函数模板: template<typenameT> Tmax_value(Tx,Ty,Tz);如果用以下的方式来调用: cout<<max_value(12,3.2,21)<<endl;在编译时会出现编译错误:“templateparameter'T'isambiguous”

北京邮电大学信息与通信工程学院2026/8/19-53-9.5.2

函数模板使用中的问题在定义指向一维数组的指针时,还必须指出一维数组的大小。声明指向一维数组的指针的格式如下: <类型名>(*指针变量名)[一维数组大小];

例如,和图11.3中两个二维数组所对应的指向一维数组的指针定义如下:char(*ptchb)[4],(*ptchc)[2];ptchb=B;ptchc=C;北京邮电大学信息与通信工程学院2026/8/19-54-9.5.2

函数模板使用中的问题要解决这样的问题,就需要函数模板和一般的函数联合使用。即需要函数模板和一般的函数的重载。北京邮电大学信息与通信工程学院2026/8/19-55-9.5.3

重载函数模板重载函数模板可以是函数模板和另一个参数数目不同的函数模板的重载,也可以是函数模板和非模板函数的重载。一般所说的函数模板重载是指后一种情况。函数模板和非模板函数重载,可以解决函数模板不支持参数自动转换的问题。当所使用的参数类型(不是类类型)不支持函数模板中某些操作时,就需要为这样的参数专门编写相应的非模板函数。和已经定义的函数模板形成重载的关系。北京邮电大学信息与通信工程学院2026/8/19-56-9.5.3

重载函数模板例如,需要用例9.10的函数模板来比较3个结构体变量,返回其中的最大值。由于结构体变量不支持直接的比较操作“>”。要实现这样的功能,就要再写一个函数。假定结构体的定义是:

structcourse {char*name; floatscore; };北京邮电大学信息与通信工程学院2026/8/19-57-9.5.3

重载函数模板3个这样的结构体变量的比较函数如下:

coursemax_value(courses1,courses2,courses3){courses4;if(s1.score>s2.score) s4=s1;elses4=s2;if(s3.score>s4.score) s4=s3;returns4;}这样就形成了函数模板和非模板函数的重载:

template<typenameT>Tmax_value(Tx,Ty,Tz);coursemax_value(courses1,courses2,courses3);北京邮电大学信息与通信工程学院9.5.4类模板类模板的定义 template<class参数化类型名1,……,class参数化类型名n> class类名 {数据成员定义; 成员函数原型;

……};北京邮电大学信息与通信工程学院9.5.4类模板在模板类的外部定义类模板的成员函数时的格式:首先要使用类模板的头部,以表明类模板定义了几个参数化类型名;作用域运算符“::”前面的类名用类模板名代替,而且也要在尖括号中注明所有类模板的参数化类型名;函数的参数表或者自动变量的定义,则是可以使用参数化类型名,也可以不使用。北京邮电大学信息与通信工程学院9.5.4类模板在类外部定义成员函数的格式如下:

template<classT1,…….,classTn>返回值类型类模板名<T1,……,Tn>::成员函数名(参数表){函数体}北京邮电大学信息与通信工程学院9.5.4类模板类模板的实例化函数模板的实例化和函数调用是一起完成的。类模板的实例化则是对象的实例化一起完成的:在类模板后面的尖括号中,表明取代参数化类型的实际类型名;再写对象名和构造对象所需要的实参数。一般化的格式如下:类模板名<类型1,……,类型n>对象名(实参数);北京邮电大学信息与通信工程学院2026/8/19-62-

例9.14

类模板的定义和实例化的示例。#include<iostream>usingnamespacestd;template<classT1,classT2>classMyClass{T1x;T2y;public:MyClass(T1a,T2b);voiddisplay();};template<classT1,classT2>MyClass<T1,T2>::MyClass(T1a,T2b){x=a; y=b;}

北京邮电大学信息与通信工程学院2026/8/19-63-

template<classT1,classT2>voidMyClass<T1,T2>::display(){cout<<x<<endl; cout<<y<<endl;}voidmain(){MyClass<int,float>Obj1(6,6.6);Obj1.display();MyClass<char,char*>Obj2('x',"Astring");Obj2.display();}北京邮电大学信息与通信工程学院9.5.4类模板

示例是带有两个参数化类型的类模板。在类外部定义成员函数时,先要声明使用了两个参数化类型的名字,然后,在类模板名后面注明这个模板要使用这些名字。再具体的定义成员函数。类模板进行两次实例化,分别输出不同类型的数据:第一次输出整型和实型,第二次输出字符和字符串。北京邮电大学信息与通信工程学院2026/8/19-65-

例9-14类模板的定义和实例化的示例//例11.14:11_14.cpp#include<iostream>usingnamespacestd;template<classT1,classT2>classMyClass{private:T1x;T2y;public:MyClass(T1a,T2b);voiddisplay();};template<classT1,classT2>MyClass<T1,T2>::MyClass(T1a,T2b){x=a;y=b;}北京邮电大学信息与通信工程学院2026/8/19-66-

template<classT1,classT2>voidMyClass<T1,T2>::display(){cout<<x<<endl;cout<<y<<endl;}intmain(){MyClass<int,float>Obj1(6,6.6);Obj1.display();MyClass<char,char*>Obj2('x',"Astring");Obj2.display();}北京邮电大学信息与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论