c多态性与虚函数习题

合集下载

多态与虚函数 例题

多态与虚函数 例题

题目:水果类与虚函数多态与虚函数例题1.题目内容与要求①首先设计一个水果类(Fruit)作为基类,成员函数为显示“水果”函数;②然后设计Fruit类的四个派生类:香蕉类(Banana)、苹果类(Apple)、梨子类(Pear)和桃子类(Peach),成员函数分别为显示“香蕉”、“苹果”、“梨子”和“桃子”函数;③最后在主函数中定义这些类的对象,并调用它们的显示函数。

2.类的分析主函数水果类对象 香蕉类对象 苹果类对象 梨子类对象 桃子类对象 显示函数调用水果类显示函数香蕉类显示函数苹果类显示函数梨子类显示函数桃子类显示函数3.类的设计mainFruit f; Banana b; Apple a; Pear p; Peach ph; f=b; f.print(); f=a; f.print(); ……FruitprintBananaprintAppleprintPearprintPeachprint4.基类程序代码// 基类: 水果类class Fruit{public:void print() {cout<< "水果" <<endl; }};// 派生类1: 香蕉类class Banana: public Fruit{ public:void print() {cout<< "香蕉" <<endl;} };// 派生类2: 苹果类class Apple: public Fruit{ public:void print() {cout<< "苹果" <<endl;} };派生类程序代码// 派生类3: 梨子类class Pear: public Fruit{ public:void print() { cout<< "梨子" <<endl;} };// 派生类4: 桃子类class Peach: public Fruit{ public:void print() { cout<< "桃子" <<endl;} };#include <iostream> using namespace std; <5个类的定义在此!>int main() // 主函数 {核心代码在此!return 0; }主函数程序代码Fruit * pFruit[] = { new Fruit(),new Banana(), new Apple(), new Pear(), new Peach() };for(int i = 0; i < 5; i++) { (*pFruit[i]).print(); }❝从以上5行运行结果来看,似乎调用的都是基类的print 函数。

C++面向对象程序设计第九章多态性与虚函数

C++面向对象程序设计第九章多态性与虚函数

13
【例9.1】虚函数的作用(改造例8.11)(P278)
class graduate:public undergraduate, public teacher // 从两个类继承 {public: void setinfo(int n, char* strname, char s, char* strfrom, float sc, float sa) { id = n; strcpy(name, strname); sex = s; strcpy(from, strfrom); score = sc; salary = sa; } graduate( ) { setinfo(1, "jetty", 'M', "china", 90, 1000); } void showinfo() { cout<<endl<<"ID: "<<id<<endl<<"name: "<<name <<endl<<"sex: "<<sex<<endl<<"from: "<<from <<endl<<"score: "<<score <<endl<<"salary: "<<salary; } };
8
9.3
纯虚函数与抽象类
被标明为不具体实现的虚成员函数为纯虚函数;其声明格式为: 被标明为不具体实现的虚成员函数为纯虚函数;其声明格式为: virtual 函数类型 函数名 参数表 ; 函数名(参数表 参数表)=0; 不能有实例对象的类即为抽象类,唯一的用途是被继承,一个抽 不能有实例对象的类即为抽象类,唯一的用途是被继承, 象类至少具有一个虚函数。 象类至少具有一个虚函数。 抽象类为抽象和设计的目的而建立, 抽象类为抽象和设计的目的而建立,将有关的数据和行为组织在 一个继承层次结构中,保证派生类具有要求的行为。 一个继承层次结构中,保证派生类具有要求的行为。对于暂时 无法实现的函数,可以声明为纯虚函数,留给派生类去实现。 无法实现的函数,可以声明为纯虚函数,留给派生类去实现。 派生类实现纯虚函数的参数要与父类纯虚函数声明的参数相同。 派生类实现纯虚函数的参数要与父类纯虚函数声明的参数相同。 抽象类不能定义对象,但可以声明抽象类的指针或引用。 抽象类不能定义对象,但可以声明抽象类的指针或引用。通过改 变指针或引用的具体地址,指向相应的派生类的对象, 变指针或引用的具体地址,指向相应的派生类的对象,以便实 现运行时的多态。 现运行时的多态。 派生类如果没有定义全部纯虚函数的操作,继承了部分纯虚函数, 派生类如果没有定义全部纯虚函数的操作,继承了部分纯虚函数, 则仍然是抽象类。 则仍然是抽象类。 【例9.3】纯虚函数和抽象类 】

c++多态性与虚函数习题

c++多态性与虚函数习题

作业题一、写出下列程序运行结果1.#include<iostream>using namespace std;class A {public:virtual void func( ) {cout<<”func in class A”<<endl;} };class B{public:virtual void func( ) {cout<<”func in class B”<<endl;} };class C:public A,public B{public:void func( ) {cout<<”func in class C”<<endl:}};int main( ){C c;A& pa=c;B& pb=c;C& pc=c;pa.func( );pb.func( );pc.func( );}2.#include<iostream>using namespace std;class A{public:virtual ~A( ){cout<<”A::~A( ) called “<<endl; }};class B:public A{char *buf;public:B(int i) { buf=new char[i]; }virtual ~B( ){delete []buf;cout<<”B::~B( ) called”<<endl;}};void fun(A *a) {delete a;}int main( ){ A *a=new B(10);fun(a);}二、程序设计题1有一个交通工具类vehicle,将它作为基类派生小车类car、卡车类truck和轮船类boat,定义这些类并定义一个虚函数用来显示各类信息。

5.2定义一个shape抽象类,派生出Rectangle类和Circle类,计算各派生类对象的面积Area( )。

C--程序设计--第10章-多态性及虚函数

C--程序设计--第10章-多态性及虚函数

使用重载函数注意:
不要使用重载函数描述不相干的函数 在类中,构造函数和普通成员函数均可以
重载 避免与函数的默认参数产生二义性
二、运算符重载
运算符重载(operate overloading)就是 赋予已有的运算符多重含义。
运算符重载实质是函数重载,运算符重载 的选择与函数重载类似,会根据运算符的 操作数的类型、个数和顺序来进行运算符 函数的选择。
#include<iostream.h> str#iinngc:l:usdter<isntgr(icnhga.rh>*s) v{}ossccsssc{s{{ittohtttolsstlsssls*drruarrrueptrepttepsi1trii3tc{pn=rin=rrn=pmn.<nn.<lprgncngncign=agp<*ggp<auitepgtepnte'irssrssbv\hwy:hwyghwnsit1ssitsla0=(:=(:=(tnr=ttnrit'scssscs:sc)rt1"rrt3scesss~ivci;thpt1hpsih1(.T23(.t::tttsnohn}ra,r.a,tza()gh(()grrrrttiatlrsilrsrer";eass;eiiiirdre[)ne[1i;[Ttt1ttnnnniglnl;gnl.nlhl)rlggggnep*e(e}(gesgeiei;2e(((gtrsnsnstnp(nsns)ncsi(lipg)gthg)ig(;(htn)en;t;tr;t;nti)a)artnthhih}ths<<ri{((;+n++<p<snd))}1g1s1aere*ige;]]i]nonszl{{;&;z;ddgd)&eercseelrl;s=teo1)m;a;/18etu)om/)0ut..;)构sr<""/;pn<造);//;s;/复}lp函构e<制n<数造ge构tn函hd造;l数};重} 载

C++习题3(继承和多态)

C++习题3(继承和多态)

C++习题3(继承和多态)C++习题3(继承和多态)一、选择题1、在C++中,类与类之间的继承关系具有( C )A)自反性 B)对称性 C)传递性 D)反对称性2、在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制 B)保持不变 C)受保护 D)不受保护3、按解释中的要求在下列程序划线处填入的正确语句是:( C )#include class Base{public:void fun(){cout<<"Base::fun"<<=""> fun()cout<<"Derived::fun"<fun();4、在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C )A)受限制 B)保持不变 C)受保护 D)不受保护5、在哪种派生方式中,派生类可以访问基类中的protected 成员(B )A)public和private B)public、protected和private C)protected和private D)仅protected6、当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A)public成员 B)private成员 C)protected成员 D)友元7、不论派生类以何种方法继承基类,都不能使用基类的(B )A)public成员 B)private成员 C)protected成员 D)public成员和protected成员8下面叙述错误的是(S )。

A )基类的protected成员在派生类中仍然是protected的 B)基类的protected成员在public派生类中仍然是protected的C)基类的protected成员在private派生类中是private的 D)基类的protected 成员不能被派生类的对象访问9、下列说法中错误的是(S )。

多态性与虚函数习题

多态性与虚函数习题

多态性与虚函数习题一、选择题1.在C++中,用于实现运行时多态性的是()。

A)内联函数B)重载函数C)模板函数D)虚函数2.如果一个类至少有一个纯虚函数,那么就称该类为()。

(a)抽象类 (b)派生类 (c)虚基类 (d)以上都不对3.为了区分一元运算符的前缀和后缀运算,在后缀运算符进行重载时,额外添加一个参数,其类型是()。

(a)void (b)char (c)int (d)float4.下列关于抽象类的说明中不正确的是()。

(a)含有纯虚函数的类称为抽象类(b)抽象类不能被实例化,但可声明抽象类的指针变量(c)抽象类的派生类可以实例化(d)纯虚函数可以被继承5.运行下列程序的输出结果为()。

#include<iostream.h>class base{public:void fun1(){cout<<"base"<<endl;}virtual void fun2(){cout<<"base"<<endl;}};class derived:public base{public:void fun1(){cout<<"derived"<<endl;}void fun2(){cout<<"derived"<<endl;}};void f(base &b){b.fun1();b.fun2();}int main(){derived obj;f(obj);return 0;}(a)base (b)base (c)derived (d)derivedBase derived base derived6.下面描述中,正确的是()。

A.virtual可以用来声明虚函数B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类C.即使基类的构造函数没有参数,派生类也必须建立构造函数D.静态数据成员可以通过成员初始化列表来初始化7. 关于虚函数的描述中,正确的是()。

第12章 多态性与虚函数补充习题

第12章 多态性与虚函数补充习题

第十二章多态性与虚函数一、选择题1、下面哪个不能实现多态(C )。

A)函数重载 B)虚函数 C)虚基类 D)运算符重载2、下面有关抽象类的说法不正确的是( A )。

A)抽象类是可以定义对象的B)抽象类通常作为基类使用C)抽象类处于继承层次结构的较上层D)抽象类刻画了一组子类操作的通用接口3、下面有关纯虚函数的说法错误的是( D )。

A)派生类可以不重新定义纯虚函数B)运算符重载函数可以被定义为纯虚函数C)纯虚函数可以被重载D)基类中的纯虚函数在派生类的对象中无法访问4、关于虚函数,正确的描述是(A )。

A)构造函数不能是虚函数B)析构函数不能是虚函数C)虚函数可以是友元函数D)虚函数是静态成员函数5、如果在基类中将show()函数声明为不带返回值的纯虚函数,正确的写法是( C )。

A)virtual show()=0;B)virtual void show();C)virtual void show()=0;D)void show()=0 virtual;6、关于动态联编的描述中,( D )是错误的。

A) 动态联编是以虚函数为基础的B) 动态联编是在运行时,确定所调用的函数代码的。

C) 动态联编调用函数操作是通过指向对象的指针或对象的引用实现的。

D) 动态联编是在编译时确定操作函数的。

7、下列关于抽象类的使用中,( A )是错误的。

A) 可以定义抽象类的对象 B) 可以定义抽象类的指针C) 可以定义抽象类的引用 D) 可以定义抽象类的派生类8、关于虚函数的描述中,(C )是正确的。

A) 虚函数是一个非static类的成员函数。

B) 虚函数是一个非成员函数。

C) 基类中说明了虚函数后,派生类中与其对应的函数可以不必说明为虚函数。

D) 派生类的虚函数与基类的虚函数具有不同的参数个数和类型。

9、关于纯虚函数和抽象类的描述中,( C )是错误的。

A) 纯虚函数是一种特殊的虚函数,它没有具体的实现。

B) 抽象类是指含有纯虚函数的类。

C 程序设计与应用基础第五章 多态性习题答案

C  程序设计与应用基础第五章 多态性习题答案
Base's des.
根据结果将程序补充完整。
#incude <iostream.h>
class Base
{
public:
Base(){cout<<"Base's cons."<<endl;}
___varitual ~Base()___{cout<<"Base's des."<endl;}
};
class Derived:public Base
第五章多态性
1、填空题
1)在一个成员函数内调用一个虚函数时,对该虚函数的调用进行___动态______联编。
2)动态联编是在__虚函数___的支持下实现的,它通过___指针和引用__来调用该函数操作。
3)下列程序的运行结果如下:
Base's cons.
Derived's cons.
Derived's des.
salesman s1;
employee *emp[4]={&m1,&t1,&sm1,&s1};
int i;
for(i=0;i<4;i++)
{
emp[i]->promote();
emp[i]->pay();
emp[i]->display();
}
}
2)编写一个程序,建立两种类型的表:队列与堆钱,使它们可以共用一个接口访问。
答案:
#include <iostream.h>
#include <string.h>
class employee
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
virtual void func2( ) {cout<<”class B func2”<<endl;}
};
则下面正确的叙述是()
A.A::func2( )和B::func1( )都是虚函数
B.A::func2( )和B::func1( )都不是虚函数
C.B::func1( )是虚函数,而A::func2( )不是虚函数
using namespace std;
class A {
public:
virtual void func( ) {cout<<”func in class A”<<endl;}
};
class B{
public:
virtual void func( ) {cout<<”func in class B”<<endl;}
D.B::func1( )不是虚函数,而A::func2( )是虚函数
3.10下列关于虚函数的说明中,正确的是()。
A.从虚基类继承的函数都是虚函数
B.虚函数不得是静态成员函数
C.只能通过指针或引用调用虚函数
D.抽象类中的成员函数都是虚函数
4.写出下列程序运行结果
4.1#include<iostream>
而唇函数具有强继承性
2.2什么是抽象类?抽象类有何作用?可以声明抽象类的对象吗?为什么?
一个类中至少有一个纯纯虚函数
抽象类中的纯虚函数可以在抽象类中定义,也可以是从它的抽象类中继承下来重订于定义
可以声明抽象类的指针和引用
2.3多态性和虚函数有何作用?
2.4是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?
A.相同B.不同C.相容D.部分相同
3.4当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中()。
A.都是虚函数
B.只有被重新说明时才是虚函数
C.只有被重新说明为virtual时才是虚函数
D.都不是虚函数
3.5(C)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。
};
class C:public A,public B{
public:
void func( ) {cout<<”func in class C”<<endl;}
};
int main( ){
C c;
A& pa=c;
B& pb=c;
C& pc=c;
pa.func( );
pb.func( );
pc.func( );
virtual ~B( ){
delete []buf;
cout<<”B::~B( ) called”<<endl;
}
};
void fun(A *a) {
1.概念填空题
1.1C++支持两种多态性,分别是静态和动态。
1.2在编译时就确定的函数调用称为静态联编,它通过使用重载函数实现。
1.3在运行时才确定的函数调用称为动态联编,它通过虚函数来实现。
1.4虚函数的声明方法是在函数原型前加上关键字virtual。在基类中含有虚函数,在派生类中的函数没有显式写出virtual关键字,系统依据以下规则判断派生类的这个函数是否是虚函数:该函数是否和基类的虚函数参数个数相同 /同名;是否与基类的虚函数相应类型相同;是否与基类的虚函数返回值类型相同。如果满足上述3个条件,派生类的函数就是虚函数。并且该函数覆盖基类的虚函数。
D.既调用类A中函数,也调用类B中的函数
3.9类定义如下。
class A{
public:
virtual void func1( ){ }
void fun2( ){ }
};
class B:public A{
public:
void func1( ) {cout<<”class B func1”<<endl;}
A.可以说明虚函数
B.可以进行构造函数重载
C.可以定义友元函数
D.不能定义其对象
3.8类B是类A的公有派生类,类A和类B中都定义了虚函数func( ),p是一个指向类A对象的指针,则p->A::func( )将()。A.调用类A中的函数func( )
B.调用类B中的函数func( )
C.根据p所指的对象类型而确定调用类A中或类B中的函数func( )
1.7类的构造函数不可以(可以/不可以)是虚函数,类的析构函数可以(可以/不可以)是虚函数。当类中存在动态内存分配时经常将类的析构函数声明成虚函数。
2.简答题
2.1在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?为什么?
不可以声明纯构造函数,可以声明纯析构函数,因为C++中构造函数不能够被继承,
}
4.2
#include<iostream>
using namespace std;
class A{
public:
virtual ~A( ){
cout<<”A::~A( ) called“<<endl; }
};
class B:public A{
char *buf;
public:
B(int i) { buf=new char[i]; }
A.虚析构函数B.虚构造函数
C.纯虚函数D.静态成员函数
3.6以下基类中的成员函数,哪个表示纯虚函数(C)。
A.virtual void vf(int);B.void vf(int)=0;
C.virtual void vf( )=0;D.virtual void vf(int){ }
3.7下列描述中,()是抽象类的特性。
1.5当通过指针或应用使用虚函数时,C++会在与对象关联的派生类中正确的选择重定义的函数。实现了运行时多态。而通过对象使用虚函数时,不能实现运行时多态。
1.6纯虚函数是一种特别的虚函数,它没有函数的函数体部分,也没有为函数的功能提供实现的代码,它的实现版本必须由派生类给出,因此纯虚函数不能是。拥有纯虚函数的类就是抽象类,这种类不能建立对象。如果纯虚函数没有被重载,则派生类将继承此纯虚函数,即该派生类也是纯虚函数。
2.5为什么析构函数总是要求说明为虚函数?
3.选择题
3.1在C++中,要实现动态联编,必须使用(D)调用虚函数。
A.类名B.派生类指针C.对象名D.基类指针
3.2下列函数中,不能说明为虚函数的是()。
A.私有成员函数B.公有成员函数C.构造函数D.析构函数
3.3在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值()。
相关文档
最新文档