C++虚函数相关练习及答案分析

合集下载

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

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

多态性与虚函数1.概念填空题1.1 C++支持两种多态性,分别是编译时和运行时。

1.2在编译时就确定的函数调用称为静态联编,它通过使用函数重载,模板等实现。

1.3在运行时才确定的函数调用称为动态联编,它通过虚函数来实现。

1.4虚函数的声明方法是在函数原型前加上关键字virtual。

在基类中含有虚函数,在派生类中的函数没有显式写出virtual关键字,系统依据以下规则判断派生类的这个函数是否是虚函数:该函数是否和基类的虚函数同名;是否与基类的虚函数参数个数相同、类型;是否与基类的虚函数相同返回类型。

如果满足上述3个条件,派生类的函数就是虚函数。

并且该函数覆盖基类的虚函数。

1.5 纯虚函数是一种特别的虚函数,它没有函数的函数体部分,也没有为函数的功能提供实现的代码,它的实现版本必须由派生类给出,因此纯虚函数不能是友元函数。

拥有纯虚函数的类就是抽象类类,这种类不能实例化。

如果纯虚函数没有被重载,则派生类将继承此纯虚函数,即该派生类也是抽象。

3.选择题3.1在C++中,要实现动态联编,必须使用(D)调用虚函数。

A.类名B.派生类指针C.对象名D.基类指针3.2下列函数中,不能说明为虚函数的是(C)。

A.私有成员函数B.公有成员函数C.构造函数D.析构函数3.3在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(A)。

A.相同B.不同C.相容D.部分相同3.4当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中(A)。

A.都是虚函数B.只有被重新说明时才是虚函数C.只有被重新说明为virtual时才是虚函数D.都不是虚函数3.5(C)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。

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下列描述中,(D)是抽象类的特性。

习题9及其解答

习题9及其解答

习题9及其解答9.1 选择题1.在C++中,要实现动态联编,必须使用( d )调用虚函数。

(a) 类名(b) 派生类指针(c) 对象名(d) 基类指针2.下列函数中,不能说明为虚函数的是( c )。

(a) 私有成员函数(b) 公有成员函数(c) 构造函数(d) 析构函数3.在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( a )。

(a) 相同(b) 不同(c) 相容(d) 部分相同4.C++中,根据( d )识别类层次中不同类定义的虚函数版本。

(a) 参数个数(b) 参数类型(c) 函数名(d) this指针类型5.虚析构函数的作用是( c )。

(a) 虚基类必须定义虚析构函数(b) 类对象作用域结束时释放资源(c) delete动态对象时释放资源(d) 无意义6.下面函数原型中,( b )声明了fun为纯虚函数。

(a) void fun()=0; (b) virtual void fun()=0;(c) virtual void fun(); (d) virtual void fun(){ };7.若一个类中含有纯虚函数,则该类称为( c )。

(a) 基类(b) 纯基类(c) 抽象类(d) 派生类8.假设 Aclass为抽象类,下列正确的说明语句是( b )。

(a) Aclass fun( int ) ; (b) Aclass * p ;(c) int fun( Aclass ) ; (d) Aclass Obj ;9.下面描述中,正确的是( d )。

(a) 虚函数是没有实现的函数(b) 纯虚函数是返回值等于0的函数(c) 抽象类是只有纯虚函数的类(d) 抽象类指针可以指向不同的派生类10.构造异质链表的意义是( d )。

(a) 用数组组织类对象(b) 用链表组织类对象(c) 用抽象类指针指向派生类对象(d) 用抽象类指针构造派生类对象链表9.2阅读下列程序,写出执行结果1.#include <iostream>using namespace std;class Bclass{ public:Bclass( int i, int j ) { x = i; y = j; }virtual int fun() { return 0 ; }protected:int x, y ;};class Iclass:public Bclass{ public :Iclass(int i, int j, int k):Bclass(i, j) { z = k; }int fun() { return ( x + y + z ) / 3; }private :int z ;};int main(){ Iclass obj( 2, 4, 10 );Bclass p1 = obj;cout << p1.fun() << endl;Bclass &p2 = obj ;cout << p2.fun() << endl;cout << p2.Bclass :: fun() << endl;Bclass *p3 = &obj;cout << p3 -> fun() << endl;}【解答】552.#include <iostream>using namespace std;class Base{ public:virtual void getxy( int i,int j = 0 ) { x = i; y = j; } virtual void fun() = 0 ;protected:int x , y;} ;class A : public Base{ public:void fun(){ cout<<"x = "<<x<<'\t'<<"y = x * x = "<<x*x<<endl; }};class B : public Base{ public:void fun(){ cout << "x = " << x << '\t' << "y = " << y << endl;cout << "y = x / y = " << x / y << endl;}} ;int main(){ Base * pb;A obj1;B obj2;pb = &obj1;pb -> getxy( 10 );pb -> fun();pb = &obj2;pb -> getxy( 100, 20 );pb -> fun();}【解答】x = 10 y = x*x = 100x = 100 y = 20y = x / y = 59.3 思考题1.在C++中,使用类体系依靠什么机制实现程序运行时的多态?【解答】在C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。

二级C++笔试353_真题(含答案与解析)-交互

二级C++笔试353_真题(含答案与解析)-交互

二级C++笔试353(总分100, 做题时间90分钟)一、选择题下列各题A) 、B) 、C) 、D) 四个选项中,只有一个选项是正确的。

1.静态成员函数不能说明为SSS_SINGLE_SELA 整型函数B 常函数C 虚函数D 内联函数分值: 2答案:C[解析] 静态函数不能说明为虚函数。

2.以下程序的输出结果为main()int m=7,n=4;float a=38.4,b=6.4,x;x=m/2+n*a/b+1/2;cout<<x<<end1;}SSS_SINGLE_SELA 27.000000B 27.500000C 28.000000D 28.500000分值: 2答案:A[解析] 本题考查表达式值的类型由参与运算的所有变量的类型中优先级最高的变量类型所决定。

不过要注意的是整型向float型转换时.将丢失小数部分,即向下驭值。

3.关于虚函数的描述中正确的是SSS_SINGLE_SELA 虚函数是一个静态成员函数B 虚函数是一个非成员函数C 虚函数既可以在函数说明时定义,也可以在函数实现时定又D 派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型分值: 2答案:D[解析] 虚函数不能定义为静态函数;虚函数的作用在于继承,表现出动态性。

所以,在派生类中定义的虚函数必须和基类中对应的虚函数具有相同的参数个数和类型。

4.若有说明:int a [3][4];则对a数组元素的非法引用是SSS_SINGLE_SELA a[0][2*1]B a[1][3]C a[4-2][0]D a[0][4]分值: 2答案:D[解析] 在数组这部分的知识里面,数组下标越界是一个比较容易忽略的问题,其下标是从。

开始,至n-1为止,因此选项D是正确答案。

5.静态成员函数没有SSS_SINGLE_SELA 返回值B this指针C 指针参数D 返回类型分值: 2答案:B[解析] this指针是系统隐含的用于指向当前对象的指针。

C++二级试题选择题练习(带注解,答案)

C++二级试题选择题练习(带注解,答案)

1.以下运算符函数中肯定不属于类FunNumber的成员函数的是__D____。

本题考查的是类的成员函数。

选项A是重载了负号或减法运算符,由于减法运算符它具有两个操作数,而题面原型中只有一个,如果重载的是减号运算符,则必为成员函数。

选项B中由于没参数,无论是负号或减法运算符至少具有一个参数,所以它必为成员函数,同时也必定是重载了负号运算符。

选项C是必定以成函数的方式重载,因为C++规定不能对内置类的运算符进行重载,所以它不可能是友元函数(因为操作数为内置的int型),所以必为成员函数重载,且必定是重载了减法运算符。

选项D有两个参数,无论是负号或减法运算符,其操作数不超2个,所以必定为友元函数重载,且重载了减法运算符。

故本题答案为D。

2.运算符重载是对已有的运算符赋予多重含义,因此__C____。

本题主要考查了运算符重载。

C++在重载运算符时,必须符合下面的条件:1、不能重载内置C++数据类型(如int,double等类型)的运算符的含义;2、不能定义C++中没有的运算符;3、不能改变重载运算符的优先级与操作数的个数;4、有些运算符不能被重载,如域运算符(::),条件运算符(?:)等,具体哪些运算符不能被重载与编译器有关。

3.有如下程序:#include <iostream>using namespace std;class Complex{double re,im;public:Complex (double r,double i):re(r),im(i) { }double real() const {return re;}double image() const { return im;}Complex& operator+=(Complex a){re+=a.re ;im+=a.im ;return *this ;}};ostream& operator<<(ostream& s,const Complex& z){return s<<'('<<z.real()<<','<<z.image()<<')';}int main(){Complex x(1,-2),y(2,3);cout<<(x+=y) <<endl;return 0;}执行这个程序的输出结果是_(3,1)_____。

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

C++(练习)第9章,多态性与虚函数

C++(练习)第9章,多态性与虚函数
A抽象类
B虚函数
C派生类
D其他都不对
参考答案
A
5.关于虚函数的描述中,()是正确的。
A虚函数是一个静态成员函数
B虚函数是一个非成员函数
C虚函数既可以在函数说明时定义,也可以在函数实现时定义
D派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型
参考答案
D
6.下面4个选项中,()是用来声明虚函数的。
C virtual void tt(int);
D virtual void tt(int){ };
参考答案
A
二.填空题
1.如果类包含了一个或多个__1__,则它是抽象类。
参考答案
1:纯虚函数
2.虚函数必须是类的__1__。
参考答案
1:非静态成员函数或成员函数
3.多态性分为两类:编译时的多态性和__1__的多态性。
参考答案
1:友元函数
7.如果在类中定义了一个成员函数为__1__,则表明在该继承层次链条的派生类中有可能重新定义这个成员函数的实现,即它可能被派生类的同名函数所覆盖。
参考答案
1:虚函数
8.动态多态性通过__1__实现。
参考答案
1:虚函数
9.定义一个函数名为fun,返回值为int,没有参数的纯虚函数的定义是__1__。
参考答案
1:引用或指针
20.含有纯虚函数的类称为__1__。
参考答案
1:抽象类
21.在C++中,编译时的多态性是通过函数重载和__1__体现的。
参考答案
1:模板
三.问答题
四.编程题
参考答案
1:纯虚函数
12.虚函数必须是类的__1__。

实验七 虚函数及应用

实验七  虚函数及应用

实验七虚函数及应用一、实验目的1.理解虚函数与运行时(动态)多态性之间的关系,掌握虚函数的定义及应用;2.理解纯虚函数与抽象类的概念,掌握抽象类的定义及应用;3.理解虚析构函数的概念及作用。

二、实验学时课内实验:2课时课外练习:2课时三本实验涉及的新知识㈠虚函数与动态多态性在C++中,如果将基类与派生类的同名成员函数定义为虚函数,就可以定义一个基类指针,当基类指针指向基类对象时访问基类的成员函数,当基类指针指向派生类对象时访问派生类的成员函数,实现在运行时根据基类指针所指向的对象动态调用成员函数,实现动态多态性。

换句话说,虚函数与派生类相结合,使C++能支持运行时(动态)多态性,实现在基类中定义派生类所拥有的通用“接口”,而在派生类中定义具体的实现方法,即“一个接口,多种方法”。

㈡虚函数的定义1.在基类中定义在定义函数的前面加上“virtual ”。

即:virtual 返回类型函数名(参数表){ …… }2.在派生类中定义函数的返回类型、函数名、参数的个数、参数类型及顺序必须与基类中的原型完全相同。

3.说明:⑴在派生类中定义虚函数时,可用“virtual”也可不用“virtual”(最好都使用)。

⑵虚函数在派生类中重新定义时,其原型必须与基类中相同。

⑶必须用基类指针访问虚函数才能实现运行时(动态)多态性;当用普通成员函数的调用方法(即用圆点运算符)调用虚函数时,为静态调用;⑷虚函数在自身类中必须声明为成员函数(不能为友元函数或静态成员函数),但在另一个类中可以声明为友元函数。

⑸虚函数可以公有继承多次,其虚函数的特性不变。

⑹构造函数不能定义为虚函数,但析构函数可以定义为虚函数。

⑺虚函数与重载函数的关系①普通函数重载是通过参数类型或参数的个数不同实现的;重载一个虚函数时,其函数原型(返回类型、参数个数、类型及顺序)完全相同。

②当重载的虚函数只有返回类型不同时,系统将给出错误信息;如果定义的虚函数只有函数名相同,而参数个数或类型不同时,则为普通函数重载。

国家二级(C++)笔试模拟试卷100(题后含答案及解析)

国家二级(C++)笔试模拟试卷100(题后含答案及解析)

国家二级(C++)笔试模拟试卷100(题后含答案及解析)题型有:1. 选择题 2. 填空题选择题(每小题2分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。

1.以下哪个特征不是面向对象思想中的主要特征( )。

A.多态B.继承C.封装D.垃圾回收正确答案:D2.下面关于虚函数的描述中,正确的是( )。

A.虚函数是一个静态成员函数B.虚函数是一个非成员函数C.虚函数既可以在函数说明时定义,也可以函数实现时定义D.派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型正确答案:D3.有关构造函数的说法不正确的是( )。

A.构造函数名字和类的名字一样B.构造函数在说明类变量时自动执行C.构造函数无任何函数类型D.构造函数有且只有一个正确答案:D4.对于常数据成员,下面描述正确的是()。

A.常数据成员可以不初始化,并且不能更新B.常数据成员必须被初始化,并且不能更新C.常数据成员可以不初始化,并且可以被更新D.常数据成员必须被初始化,并且可以被更新正确答案:B5.下列描述中错误的是( )。

A.派生类可以作为基类派生其他的子类B.派生类继承基类的所有数据成员C.派生类可以有多个基类D.派生类不能继承一些函数成员正确答案:B6.实现输出为八进制的符号是( )。

A.decB.hexC.octD.setw(8)正确答案:C7.派生类的对象对它的基类成员中( ),是可以访问的。

A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员正确答案:A8.下列说法中错误的是( )。

A.公有继承时基类中的public成员在派生类中仍是public的B.公有继承时基类中的private成员在派生类中仍是private的C.私有继承时基类中的public成员在派生类中是private的D.保护继承时基类中的public成员在派生类中是protected的正确答案:B9.有如下程序段&include<iostream.h>void main( ) {int a=14,b=15,x;char c=‘A’:x=(a && b) && (c<’B’=;cout<<x;= 执行该程序段后,x的值为A.tureB.FALSEC.0D.1正确答案:D10.若有说明:int [3][4]={0};则下面叙述正确的( )。

虚函数部分习题

虚函数部分习题
#include”iostream.h”
Class Mammal
{
Public:
(1)void Speak(){cout<<”This is a Mammal!”<<endl;}
};
Class Dog:public Mammal
{
Public:
void Speak(){cout<<”this is a Dog!”<<endl;}
{
B b,*pb=&b;
A a,*pa=&a;
void (A::*paf1)()=A::f1;
void (A::*paf2)()=A::f2;
void (B::*pbf1)()=B::f1;
void (B::*pbf2)()=B::f2;
(pa->*paf1)();
pa=&b;
(pa->*paf1)();
pa->print(); pb->print();
delete pa;
}
5.下列程序中声明一个Mammal类,再由此派生出Dog类,二者都定义Speak()成员函数,基类中定义Speak()为虚函数。主程序中分别声明一个Mammal类和Dog类的对象,再分别 用对象名.函数名和指针的形式调用Speak()函数。请填空完成程序,并上机运行验证。
{
protected:
int k;
public:
XX ( int n = 5 ) : k (n){ }
~XX ( )
{cout<<“XX”;}
virtual void f ( ) ;
};
void XX :: f ( )

最新《C++程序设计案例教程》习题答案第9章 多态性和虚函数的使用

最新《C++程序设计案例教程》习题答案第9章  多态性和虚函数的使用

第9章多态性和虚函数的使用一、选择题1.C. 2.C 3.A 4.C 5. 6.D二、程序题(略)三、简答题1.C++多态性主要体现在哪两个方面?答:在C++中,多态性是指系统调用同名的函数,实现不同的功能。

多态性包含静态多态性和动态多态性。

静态多态性体现在编译时函数重载或者运算符重载上;展现了同一类中多个同名函数的处理机制。

而动态多态性是指程序运行过程中通过虚函数动态地确定针对的对象,展现继承层次结构中同名函数的处理机制。

2. 比较函数重载和虚函数在概念上和使用方式有什么区别。

函数重载是指函数名称相同,但是参数的个数或者参数的数据类型不同。

因此,系统调用重载函数时,会依据参数确定调用哪一个。

而在继承的机制中,基类的成员函数可能会与派生类新增的成员函数同名,包括参数个数和参数类型,这种现象不属于函数重载。

当基类的一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。

派生类可以对虚函数重新定义。

虚函数实现动态多态的问题。

3.比较抽象类、虚函数、纯虚函数的概念和使用上的区别。

虚函数通常在基类中定义,定义可以是空,派生类中可以对虚函数重写,也可以不写。

虚函数起到了接口的默认行为作用。

纯虚函数在基类中是没有定义的,必须在直接或者间接派生类中加以实现,它起到了接口的作用。

包含了纯虚函数的类,被称为抽象类。

抽象类不能建立对象。

4.谈谈虚基类和虚函数,区分两者不同的概念和各自的作用。

在继承机制中,一个派生类继承多个直接基类,而这些基类又有一个公共的基类,这个公共的基类成员在继承中可能产生多个拷贝。

虚基类的基本原则是在内存中只有基类成员的一份拷贝。

这样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。

用virtual限定符把基类继承说明为虚拟的。

虚函数指基类中成员函数声明为 virtual ,使它在一个或多个派生类中被重新定义,虚函数的作用是实现多态性。

虚函数必须是基类的非静态成员函数,其访问权限可以protected或public。

C++期末试题2

C++期末试题2

第一部分选择题(共20分)一、单项选择题(本大题共10小题,每小题2分,共20分)1.在C++中,函数原型不能标识( D )A.函数的返回类型B.函数参数的个数C.函数参数类型D.函数的功能p108有叙述2.在C++程序中,对象之间的相互通信通过( B ) ?A.继承实现B.调用成员函数实现C.封装实现D.函数重载实现3.对于任意一个类,析构函数的个数最多为( B )A.0B.1C.2D.3P288 析构函数不接受参数,也不返回数值。

类只可能有一个析构函数,不能进行析构函数的重灾。

4.下面函数模板定义中不正确的是( A )A.template<class Q>B.template<class Q>QF(Q x){ QF(Q x){return Q+x; return x+x;} }C.template<class T>D.template<class T>TF(T x){ TF(T x){return x*x; return x>1;} }5.友元关系不能( c A )?A.继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系p316D.提高程序的运行效率6.语句ofstream f(〃SALARY.DAT〃,ios::app|ios::binary);的功能是建立流对象f,试图打开文件SALARY.DAT并与之连接,并且( A )A.若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件B.若文件存在,将其置为空文件;若文件不存在,打开失败C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件D.若文件存在,打开失败;若文件不存在,建立一个新文件7.下面说法正确的是( B )A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方C.类的内联函数必须在类体内定义D.类的内联函数必须在类体外通过加关键字inline定义8.可以用p.a的形式访问派生类对象p的基类成员a,其中a是( D )A.私有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.公有继承的公有成员9.在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( A )A.派生类的对象可以赋给基类的对象B.派生类的对象可以初始化基类的引用C.派生类的对象可以直接访问基类中的成员D.派生类的对象的地址可以赋给指向基类的指针10.对于类定义class A{public:virtual void func1( ){ }void func2( ){ }};class B:public A{public:void func1( ){cout<<〃class B func 1〃<<end1;}virtual void func2( ){cout<<〃class B func 2〃<<end1;}};下面正确的叙述是( C )A. A::func2( )和B::func1( )都是虚函数B. A::func2( )和B::func1( )都不是虚函数C. B::func1( )是虚函数,而A::func2( )不是虚函数D. B::func1( )不是虚函数,而A::func2( )是虚函数第二部分非选择题(共80分)二、填空题(本大题共10小题,每小题2分,共20分)不写解答过程,将正确的答案写在每小题的横线处。

实验十一_虚函数答案

实验十一_虚函数答案

实验十一_虚函数答案实验十一虚函数一、实验目的1)掌握虚函数的定义和使用2)掌握抽象类的定义和使用3)掌握纯虚函数的定义4)掌握虚析构函数、纯虚函数和抽象类的作用二、实验原理1.利用虚函数的作用:当编译器编译虚函数时,编译系统将用动态连接的方式进行编译。

即在编译时不确定该虚函数的版本,而是利用一种机制在运动过程中根据其所指向的实例决定使用哪一个函数版本。

2.利用虚析构函数的原则:当将基类指针或引用new运算符指向派生类对象时,为了在释放派生类对象时能调用派生类的析构函数,必须将基类的析构函数定义为虚函数。

3.抽象类的作用:为它的所有派生类提供一个公共接口,纯虚函数是定义抽象类的一种间接手段。

三、实验设备实验室里调备的计算机、window xp,visual c++6.0四、实验内容4.1分析下面各题程序,按各题的要求进行实验1)分析下面的程序,指出程序运行的结果:#includeclass CBase{public:virtual void f1() //将成员函数f1()声明为虚函数{cout<<"调用函数CBase::f1()!"<<endl;}< p="">virtual void f2() //将成员函数f2()声明为虚函数{cout<<"调用函数CBase::f2()!"<<endl;}< p="">void f3() //一般成员函数{cout<<"调用函数CBase::f3()!"<<endl;}< p=""> };class CDerived:public CBase //公有继承CBase {void f1(){cout<<"调用函数CDerived::f1()!"<<endl;}< p=""> void f2(){cout<<"调用函数CDerived::f2()!"<<endl;}< p=""> void f3(){cout<<"调用函数CDerived::f3()!"<<endl;}< p=""> };void main(){CBase obj1,*p; //定义CBase的对象obj1和指针对象p CDerived obj2; //定义CDerived的对象obj1p=&obj1 //将obj1的地址给pp->f1(); //通过p调用基类版本的f1()函数p->f2(); //通过p调用基类版本的f2()函数p->f3(); //通过p调用基类版本的f3()函数p=&obj2 //将派生类对象obj2的地址赋给pp->f1(); //动态连接,调用派生类版本p->f2(); //动态连接,调用派生类版本p->f3(); // 调用基类版本}运行的结果:调用函数CBase::f1()!调用函数CBase::f2()!调用函数CBase::f3()!调用函数CDerived::f1()!调用函数CDerived::f2()!调用函数CBase::f3()!Press any key to continue2)分析下面的程序,指出程序运行的结果:#includeclass CBase{public:CBase() //CBase类的构造函数{cout<<"调用构造函数CBase()!"<<endl;< p="">fun();} //构造函数中调用虚函数fun() virtual void fun() //定义虚函数{cout<<"调用构造函数CBase::fun()!"<<endl;}< p="">};class CDerived:public CBase{public:CDerived() //CDerived类的构造函数{cout<<"调用构造函数CDerived()!"<<endl;< p="">fun();} //构造函数中调用虚函数fun() void fun(){cout<<"调用构造函数CDerived::fun()!"<<endl;}< p="">};void main(){CDerived d; //创建对象d.fun();}运行结果:调用构造函数CBase()!调用构造函数CBase::fun()!调用构造函数CDerived()!调用构造函数CDerived::fun()!调用构造函数CDerived::fun()!Press any key to continue3)分析下面的程序,指出程序的错误#include#includeclass CBase{protected:char *ch;public:CBase(char *x){ch=new char[20];strcpy(ch,x);}virtual void fun()=0;virtual void fun1() //虚函数{cout<<x<<endl;}< p="">{cout<<ch<<endl;}< p="">~CBase(){delete[]ch; cout<<"~CBase()"<<endl;< p="">}};class CDerived:public CBase{protected:char *ch;public:CDerived (char *x,char*y):CBase(y){ch=new char[20];strcpy(ch,x);}void fun1()// {cout<<x<<endl;}< p="">{cout<<ch<<endl;}< p="">Virtual ~CDerived(){delete[]ch; cout<<"~CDerived()"<<endl;}< p=""> void main(){CBase obj1("Hello"),*p;p=&obj1p->fun1();p->fun();p=new CDerived("China","Hello"); p->fun1(); p->fun();delete p;}运行结果:HelloChina~CBase()~CBase()Press any key to continue修正后的源代码:#include#include#includeusing namespace std;class CBase{protected:char *ch;public:CBase(const char *x){ch = new char[20];strcpy(ch, x);}virtual void fun() {};virtual void fun1(){cout << ch << endl;};~CBase(){delete []ch;cout << "~CBase()" << endl;}};class CDerived: public CBaseprotected:char *ch;public:CDerived(const char *x, const char *y): CBase(y) {ch = new char[20];strcpy(ch, x);}void fun1(){cout << ch << endl;}~CDerived(){delete []ch;cout << "~CDerived()<<endl;";< p="">}};int main()CBase obj1("Hello"), *p;p = &obj1p->fun1();p->fun();p = new CDerived("China", "Hello");p->fun1();p->fun();delete p;return 0;}4.2编写并调试程序1)编写一个程序计算三角,正方形和圆形的面积。

2012年3月计算机二级C++模拟试题及答案(4)

2012年3月计算机二级C++模拟试题及答案(4)

⼀、选择题 1.数据结构作为计算机的⼀门学科,主要研究数据逻辑结构、对各种数据结构进⾏运算,及( )A.数据的存储结构B.计算⽅法C.数据映象D.逻辑存储 【参考答案】 A 2.在计算机中,算法是指( )A.加⼯⽅法B.解题⽅案的准确⽽完整的描述C.排序⽅法D.查询⽅法 【参考答案】 B 3.开发软件所需⾼成本和产品的低质量之间有着尖锐的⽭盾,这种现象称做( )A.软件投机B.软件危机C.软件⼯程D.软件产⽣ 【参考答案】 B 4.开发⼤型软件时,产⽣困难的根本原因是( )A.⼤系统的复杂性B.⼈员知识不⾜C.客观世界千变万化D.时间紧、任务重 【参考答案】 A 5.数据库、数据库系统和数据库管理系统之间的关系是( ) A.数据库包括数据库系统和数据库管理系统 B.数据库系统包括数据库和数据库管理系统 C.数据库管理系统包括数据库和数据库系统 D.3者没有明显的包含关系 【参考答案】 B 6.下列叙述中正确的是( )A.线性表是线性结构B.栈与队列是⾮线性结构C.线性链表是⾮线性结构D.⼆叉树是线性结构 【参考答案】 A 7.已知数据表A中每个元素距其最终位置不远,为节省时间,应采⽤的算法是( )A.堆排序B.直接插⼊排序C.快速排序D.直接选择排序 【参考答案】 B 8.下列不属于结构化分析的常⽤⼯具的是( )A.数据流图B.数据字典C.判定树D.PAD图 【参考答案】 A 9.下列⼯具中为需求分析常⽤⼯具的是( )A.PADB.PFDC.N-SD.DFD 【参考答案】 D 10.数据库的故障恢复⼀般是由( )A.数据流图完成的B.数据字典完成的C.DBA完成的D.PAD图完成的 【参考答案】 C 11.关于C++与C语⾔关系描述中错误的是( ) A.C++语⾔是C语⾔的超集 B.C++语⾔对C语⾔进⾏了扩充 C.C++语⾔包含C语⾔的全部语法特征 D.C++语⾔与C语⾔都是⾯向对象的程序设计语⾔ 【参考答案】 D 12.在C++语⾔中,不合法的实型数据的是( )A.0.123B.123e3C.2.1e3.5D.123.0 【参考答案】 C 13.下⾯有关于for循环的正确描述是( ) A.for循环只能⽤于循环次数已经确定的情况 B.for循环是先执⾏循环体语句,后判断表达式 C.在for循环中,不能⽤break语句跳出循环体 D.for循环的循环体语句中,可以包含多条语句,但必须⽤花括号括起来 【参考答案】 D 14.假定int类型变量占⽤两个字节,其有定义int x[10]={0,2,4};,则数组x在内存中所占字节数是( )A.3B.6C.10D.20 【参考答案】 D 15.以下叙述正确的是( ) A.函数可以嵌套定义但不能嵌套调⽤ B.函数既可以嵌套调⽤也可以嵌套定义 C.函数既不可以嵌套定义也不可以嵌套调⽤ D.函数可以嵌套调⽤但不可以嵌套定义 【参考答案】 D 16.下⾯的语句中错误的是( )A.int a=5;int x[a];B.const int a=5;int x[a];C.int n=5;int *p=new int[a];D.const int n=5;int *p=new int[a]; 【参考答案】 A 17.关于⼆义性的描述错误的是( )A.⼀个⼦类的两个⽗类中都有某个同名成员,在⼦类中对该成员访问可能出现⼆义性B.解决⼆义性可以⽤对成员名的限定法 C.⽗类和⼦类中同时出现同名函数,也可能存在⼆义性 D.⼀个⼦类是从两个⽗类派⽣出来的,⽽这两个⽗类⼜有⼀个共同的⽗类,对该⽗类成员进⾏访问时,可能出现⼆义性 【参考答案】 C 18.函数模板:template T add(T x,T y) {return x+y;} 下列对add函数的调⽤不正确的是( )A.add< >(1,2)B.add(1,2)C.add(1.0,2)D.add(1.0,2.0) 【参考答案】 C 19.this指针是C++实现什么的⼀种机制?( )A.抽象B.封装C.继承D.重载 【参考答案】 B 20.下列程序的输出结果是( ) #include class Myclass{ public:Myclass(int i=0,int j=0) { y=j; } void show(){cout< void show()const{cout< privated: int x;int y; }; void main() {yclass my1(3,4); const my2(7,8); my1.show();my2.show();}A.x=4,y=3;x=7,y=8B.x=3,y=4;x=7,y=8C.x=7,y=8;x=4,y=3D.x=8,y=7;x=7,y=8 【参考答案】 A 21.在C++语⾔中,打开⼀个⽂件就是将这个⽂件与⼀个什么建⽴关联( )A.流B.类C.结构D.对象 【参考答案】 A 22.执⾏语句for(i=1;i++<4;);,后变量i的值是( )A.3B.4C.5D.不定 【参考答案】 C 23.下列哪个是C++语⾔的有效标识符?( )A._No1B.No.1C.12345D.int 【参考答案】 A 24.下列程序的执⾏结果为( ) #include void main() {int a=3,b=0; int *p=&a; b=+a++; cout<A.3,4B.4,3C.3,-4D.4,4 【参考答案】 B 25.下列选项,不正确的是( )A.for(int a=1;a<=10;a++);B.int a=1; do {a++} while(a<=10)C.int a=1;D.for(int a=1;a<=10;a++)a++; while(a<=10) {a++} 【参考答案】 B 26.下列程序的输出结果为( ) #include void main() {char *a[]={″hello″,″the″,″world″}; char **pa=a; pa++; cout<A.helloB.theC.worldD.hellotheworld 【参考答案】 B 27.下列程序的输出结果是( ) #include int min(int a,int b) {if(a else return b; return 0;} void main() {cout<A.0B.1C.2D.3 【参考答案】 B 28.对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( )A.公有类型B.私有类型C.保护类型D.友元类型 【参考答案】 D 29.类的析构函数的作⽤是( )A.⼀般成员函数的初始化B.类的初始化C.对象的初始化D.删除类创建的对象 【参考答案】 D 30.下⾯对静态数据成员的描述中,正确的是( ) A.静态数据成员可以在类体内进⾏初始化 B.静态数据成员不可以被类的对象调⽤ C.静态数据成员不能受private控制符的作⽤ D.静态数据成员可以直接⽤类名调⽤ 【参考答案】 D 31.在公有派⽣情况下,有关派⽣类对象和基类对象的关系,下列叙述不正确的是( ) A.派⽣类的对象可以赋给基类的对象 B.派⽣类的对象可以初始化基类的引⽤ C.派⽣类的对象可以直接访问基类中的成员 D.派⽣类的对象的地址可以赋给指向基类的指针 【参考答案】 C 32.下列关于虚基类的描述,错误的是( ) A.设置虚基类的⽬的是为了消除⼆义性 B.虚基类的构造函数在⾮虚基类之后调⽤ C.若同⼀层中包含多个虚基类,这些基类的构造函数按它们说明的次序调⽤ D.若虚基类由⾮虚基类派⽣⽽来,则仍然先调⽤基类构造函数,再调⽤派⽣类的构造函数 【参考答案】 B 33.下列运算符中,在C++语⾔中不能重载的是( )A.*B.>=C.::D./ 【参考答案】 C 34.下列程序的运⾏结果是( ) #include class A { int a; public: A() {a=0;} A(int aa) {a=aa; cout< void main() {A x,y(2),z(3); cout<A.00B.23C.34D.25 【参考答案】 B 35.判断char型变量c是否为⼩写字母的正确表达式是( )A.′a′<=c<=′z′B.(c>+A)&&(c<=z)C.(′a′>=c)||(′z′<=c)D.(c>=′a′)&&(c<=′z′) 【参考答案】 D ⼆、填空题 1.长度为 n 的顺序存储线性表中,当在任何位置上插⼊⼀个元素概率都相等时,插⼊⼀个元素所需移动元素的平均个数为【1】。

继承与虚函数习题

继承与虚函数习题

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

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

(a)抽象类(b)派生类(c)虚基类(d)以上都不对3.下列关于抽象类的说明中不正确的是()。

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

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 derived二、填空题3.运行下列程序结果为_________________。

class one{public:virtual void f(){cout<<"1";}};class two:public one{public:two(){cout<<"2";}};class three:public two{public:virtual void f(){two::f();cout<<"3"; }};int main(){one aa,*p;two bb;three cc;p=&cc;p->f();return 0;}4.运行下列程序结果为_____________。

国家二级(C++)笔试模拟试卷230(题后含答案及解析)

国家二级(C++)笔试模拟试卷230(题后含答案及解析)

国家二级(C++)笔试模拟试卷230(题后含答案及解析)题型有:1. 选择题 2. 填空题选择题(每小题2分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。

1.下列叙述中正确的是A.实体集之间一对一的联系实际上就是一一对应的关系B.关系模型只能处理实体集之间一对一的联系C.关系模型属于格式化模型D.以上三种说法都不对正确答案:D解析:实体集之间一对一的联系不一定是一一对应的关系。

例如,在一个教室中,实体集“学生”与实体集“座位”之间是一对一的联系。

因为实体集“学生”中的每一个学生最多与实体集“座位”中的一个座位有联系(学生坐在该座位上);并且,实体集“座位”中的每一个座位也最多与实体集“学生”中的一个学生有联系(座位上坐着该学生)。

但该教室中的学生与座位之间不一定是一一对应的关系,因为有可能某些座位是空的,没有学生去坐。

因此,选项A中的说法是错误的。

在关系模型中,由于使用表格数据来表示实体之间的联系,因此,可以直接描述多对多的实体联系。

因此,选项B中的说法也是错误的。

关系模型是与格式化模型完全不同的数据模型,它与层次模型、网状模型相比有着本质的区别。

关系模型是用表格数据来表示实体本身及其相互之间的联系,它是建立在数学理论基础上的。

因此,选项C中的说法也是错误的。

2.下列关于虚函数的描述中,正确的是A) 虚函数是一个static类型的成员函数B) 虚函数是一个非成员函数C) 基类中采用virtual说明一个虚函数后,派生类中定义相同类型的函数时可不必加virtualD) 派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型A.B.C.D.正确答案:C解析:虚函数是在类的声明中使用virtual关键字来限定的成员函数,在成员函数实现时不能再使用virtual关键字进行限定。

派生类中的虚函数必须和基类中的虚函数的形参个数、形参类型、返回值完全一致。

C++练习题(附答案)

C++练习题(附答案)

5.9(11)下列关于C++函数的叙述中,正确的是A)每个函数至少要具有一个参数B)每个函数都必须返回一个值C)函数在被调用之前必须先声明D)函数不能自己调用自己(12)下列关于类和对象的叙述中,错误的是A)一个类只能有一个对象B)对象是类的具体实例C)类是对某一类对象的抽象D)类和对象的关系是一种数据类型与变量的关系(13)在C++中,用于实现运行时多态性的是A)内联函数B)重载函数C)模板函数D)虚函数(14)下列关于运算符重载的叙述中,正确的是A)通过运算符重载,可以定义新的运算符B)有的运算符只能作为成员函数重载C)若重载运算符+,则相应的运算符函数名是+D)重载一个二元运算符时,必须声明两个形参(15)下列关于模板的叙述中,错误的是A)模板声明中的第一个符号总是关键字templateB)在模板声明中用<和>括起来的部分是模板的形参表C)类模板不能有数据成员D)在一定条件下函数模板的实参可以省略(16)对于语句cout<<endl<<x;中的各个组成部分,下列叙述中错误的是A)"cout"是一个输出流对象B)"endl"的作用是输出回车换行C)"x"是一个变量D)"<<"称作提取运算符(17)下列字符串中,正确的C++标识符是A)foo-1 B)2bC)new D)_256(18)已知枚举类型定义语句为:enum Token{NAME,NUMBER,PLUS=5,MINUS,PRINT=10};则下列叙述中错误的是A)枚举常量NAME 的值为1 B)枚举常量NUMBER 的值为1C)枚举常量MINUS 的值为6 D)枚举常量PRINT 的值为10(19)执行语句序列int i=0;while(i<25)i+=3;cout<<i;输出结果是A)24 B)25C)27 D)28(20)要定义一个具有 5 个元素的一维数组vect,并使其各元素的初值依次是30,50,-88,0 和0,则下列定义语句中错误的是A)int vect[]={30,50,-88}; B)int vect[]={30,50,-88,0,0};C)int vect[5]={30,50,-88}; D)int vect[5]={30,50,-88,0,0};(21)有如下程序:#include <iostream>void fun(int& x,int y){int t=x;x=y;y=t;}int main(){int a[2]={23,42};fun(a[1],a[0]);std::cout<<a[0]<<","<<a[1]<<std::endl;return 0;}执行后的输出结果是A)42,42 B)23,23C)23,42 D)42,23(22)有如下类声明:class Foo { int bar; };则Foo 类的成员bar 是A)公有数据成员B)公有成员函数C)私有数据成员D)私有成员函数(23)有如下类声明:class MyBASE{int k;public:void set(int n){k=n;}int get()const{return k;}};class MyDERIVED:protected MyBASE{protected:int j;public:void set(int m,int n){MyBASE::set(m);j=n;}int get()const{return MyBASE::get()+j;}};则类MyDERIVED 中保护的数据成员和成员函数的个数是A)4 B)3C)2 D)1(24)已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;,下列关于这个函数的叙述中,错误的是A)这是运算符-的重载运算符函数B)这个函数所重载的运算符是一个一元运算符C)这是一个成员函数D)这个函数不改变类的任何数据成员的值(25)有如下函数模板定义:template <class T>T func(T x,T y){ return x*x+y*y;}在下列对func 的调用中,错误的是A)func(3,5); B)func(3.0,5.5);C)func(3,5.5); D)func<int>(3,5.5);(27)在下列函数原型中,可以作为类AA 构造函数的是A)void AA(int);B)int AA();C)AA(int)const;D)AA(int);(28)下列关于this 指针的叙述中,正确的是A)任何与类相关的函数都有this 指针B)类的成员函数都有this 指针C)类的友元函数都有this 指针D)类的非静态成员函数才有this 指针(29)有如下程序:#include <iostream>using namespace std;class Test{public:Test() {n+=2; }~Test() {n-=3; }static int getNum() {return n; }private:static int n;};int Test::n=1;int main(){Test* p=new Test;delete p;cout<<"n="<<Test::getNum()<<endl;return 0;}执行后的输出结果是A)n=0 B)n=lC)n=2 D)n=3(30)有如下程序:#include <iostream>using namespace std;class A {public:A(){cout<<"A";}};classB{public:B(){cout<<"B";}}classC:public A{B b;public:C(){cout<<"C";}};int main(){ C obj; return 0;}执行后的输出结果是A)CBA B)BACC)ACB D)ABC(31)有如下类声明:class XA{int x;public:XA(int n){x=n;}};class XB:public XA{int y;public:XB(int a,int b);};在构造函数XB 的下列定义中,正确的是A)XB::XB(int a,int b):x(a),y(b){} B)XB::XB(int a,int b):XA(a),y(b){}C)XB::XB(int a,int b):x(a),XB(b){} D)XB::XB(int a,int b):XA(a),XB(b){}(32)有如下程序:#include <iostream>using namespace std;class BASE{public:~BASE(){cout<<"BASE";}};class DERIVED:public BASE{public:~DERIVED(){cout<<"DERIVED";}};int main(){DERIVED x;return 0;}执行后的输出结果是A)BASE B)DERIVEDC)BASEDERIVED D)DERIVEDBASE(33)在表达式x+y*z 中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。

C 复习题 答案

C 复习题 答案

C++总复习题一、单项选择题1.说明虚函数的关键字是()。

A. inlineB. virtualC. defineD. static2.在每个C++程序中都必须包含有这样一个函数,该函数的函数名为()。

A. mainB. MAINC. nameD. function3.cout是某个类的标准对象的引用,该类是()。

A. ostreamB. istreamC. stdoutD. stdin4.如果在类外有函数调用CPoint::func();则函数func()是类CPoint的()。

A.私有静态成员函数B. 公有非静态成员函数C. 公有静态成员函数 B. 友元函数5. 如果class类中的所有成员在定义时都没有使用关键字public、private或protected,则所有成员缺省定义为()。

A. publicB. protectedC. private D.static6.一个类的所有对象共享的是()。

A. 私有数据成员B. 公有数据成员C. 保护数据成员D. 静态数据成员7.动态联编所支持的多态性称为()。

A. 虚函数B. 继承C. 编译时多态性D. 运行时多态性8.定义类模板时要使用关键字()。

A. constB. newC. deleteD. template9.对虚基类的定义()。

A.不需要使用虚函数B. 必须使用虚函数C. 必须使用privatD. 必须使用public10.类型转换函数()。

A. 不能带有参数B. 只能带一个参数C. 只能带2个参数D. 只能带3个参数参考答案:1.B 2.A 3.A 4.C 5.C 6.D 7.D 8.D 9.A 10.A1.下面有关重载函数的描述中,正确的是()。

A)重载函数必须具有不同的返回值类型B)重载函数形参个数必须不同C)重载函数必须具有不同的形参表D)重载函数名可以不同2.假定MyCIass为一个类,那么下列的函数说明中,()为该类的析构函数。

C复习题答案

C复习题答案

C++总复习题一、单项选择题1.说明虚函数的关键字是()。

A. inlineB. virtualC. defineD. static2.在每个C++程序中都必须包含有这样一个函数,该函数的函数名为()。

A. mainB. MAINC. nameD. function3.cout是某个类的标准对象的引用,该类是()。

A. ostreamB. istreamC. stdoutD. stdin4.如果在类外有函数调用CPoint::func();则函数func()是类CPoint的()。

A.私有静态成员函数B. 公有非静态成员函数C. 公有静态成员函数 B. 友元函数5. 如果class类中的所有成员在定义时都没有使用关键字public、private或protected,则所有成员缺省定义为()。

A. publicB. protectedC. private D.static6.一个类的所有对象共享的是()。

A. 私有数据成员B. 公有数据成员C. 保护数据成员D. 静态数据成员7.动态联编所支持的多态性称为()。

A. 虚函数B. 继承C. 编译时多态性D. 运行时多态性8.定义类模板时要使用关键字()。

A. constB. newC. deleteD. template9.对虚基类的定义()。

A.不需要使用虚函数B. 必须使用虚函数C. 必须使用privatD. 必须使用public10.类型转换函数()。

A. 不能带有参数B. 只能带一个参数C. 只能带2个参数D. 只能带3个参数参考答案:1.B2.A3.A 4.C 5.C 6.D7.D 8.D9.A10.A1.下面有关重载函数的描述中,正确的是()。

A)重载函数必须具有不同的返回值类型B)重载函数形参个数必须不同C)重载函数必须具有不同的形参表D)重载函数名可以不同2.假定MyCIass为一个类,那么下列的函数说明中,()为该类的析构函数。

A)void~MyClass();B)~MyClass(int n);C)MyClass( );D)~MyClass( );3.()是以一种完全通用的方法来设计函数或类而不必预先说明将被使用的每个对象的类型。

国家计算机二级(C++)89_真题(含答案与解析)-交互

国家计算机二级(C++)89_真题(含答案与解析)-交互

国家计算机二级(C++)89(总分460, 做题时间120分钟)选择题(每小题2分,共70分) 下列各题四个选项中,有一个是正确的,请选择正确答案。

1.以下哪个基类中的成员函数表示纯虚函数?SSS_SINGLE_SELA virtual void vf(int)B void vf(int)=0C virtual void vf(=0)D virtual void yf(int){ }分值: 2答案:BC++中纯虚函数的定义与虚函数的关键字一样,在函数末尾要加上“=0”。

2.要想使23.78965421的输出为23.7887应用的语句是()。

SSS_SINGLE_SELA 一个子类的两个父类中都有某个同名成员,在子类中对该成员访问可能出现二义性B 解决二义性可以用对成员名的限定法C 父类和子类中同时出现同名函数,也可能存在二义性D 一个子类是从两个父类派生出来的,而这两个父类又有一个共同的父类,对该父类成员进行访问时,可能出现二义性分值: 2答案:C多线程不是同时执行几个事件,在某个时间上,计算机还是在执行一个事件,只是多线程将程序分为几个并行的子任务,由它们并发交叉执行。

在宏观上看,好像是同时执行几个事件。

3.数据库设计的根本目标是要解决______。

SSS_SINGLE_SELA 数据共享问题B 数据安全问题C 大量数据存储问题D 简化数据维护分值: 2答案:A由于数据的集成性使得数据可为多个应用所共享,特别是在网络发达的今天,数据库与网络的结合扩大了数据关系的应用范围。

数据的共享本身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不一致性。

因此,数据库设计的根本目标是要解决数据共享问题。

4.已知枚举类型声明语句为: enum COLOR{WHITE,YELLOW,GREEN=5,RED,BLACK=10};则下列说法中错误的是SSS_SINGLE_SELA 枚举常量YELLOW的值为1B 枚举常量RED的值为6C 枚举常量BLACK的值为10D 枚举常量WHITE的值为1分值: 2答案:D枚举值是常量,不是变量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调用该函数,观测并分析输出的结果。
代码:
#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"调用A的构造函数"<<endl;A::func();}
virtual void func(){cout<<"A::func()"<<endl;}
~A(){cout<<"调用A的析构函数"<<endl;}
};
class D
{
public:
D(){cout<<"调用D的构造函数"<<endl;}
void func(){cout<<"D::func()"<<endl;}
~D(){cout<<"调用D的析构函数"<<endl;}
};
class B:public A
};
class B:public A
{
public:
B(){cout<<"调用B的构造函数"<<endl;B::func();}
void func(){cout<<"B::func()"<<endl;}
~B(){cout<<"调用B的析构函数"<<endl;}
D d;
};
class C:public B
~A(){cout<<"调用A的析构函数"<<endl;}
};
class D
{
public:
D(){cout<<"调用D的构造函数"<<endl;}
~D(){cout<<"调用D的析构函数"<<endl;}
};
class B:public A
{
public:
D d;
B(){cout<<"调用B的构造函数"<<endl;}
~B(){cout<<"调用B的析构函数"<<endl;}
};
int main(void)
{
A *p =new B;
delete p;
return 0;
}
运行结果:
将A的析构函数不设置为虚析构函数时的代码:
#include <iostream>using namespac std;class A
{
1、A,B,C,D四个类,分别是B继承于A,C继承于B,其中B类中内嵌一D对象,
在main函数中构造一C对象,观测构造函数和析构函数的调用顺序。
代码:
#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"调用A的构造函数"<<endl;}
{
public:
C(){cout<<"调用C的构造函数"<<endl;C::func();}
void func(){cout<<"C::func()"<<endl;}
~C(){cout<<"调用C的析构函数"<<endl;}
};
int main(void)
{
C c;
return 0;
}运行结果:
结果分析:
using namespace std;
class A
{
public:
A(){cout<<"调用A的构造函数"<<endl;}
virtual ~A(){cout<<"调用A的虚析构函数"<<endl;}
};
class B:public A
{
public:
B(){cout<<"调用B的构造函数"<<endl;}
在主函数中创建一个C的对象,分别调用A、B、C的构造函数,基类和派生类中都调用了自己的func()函数。
4、有类A,派生出类B,有如下代码
A *p = new B;
delete p;
观察并分析将A的析构函数设置或不设置为虚析构函数的表现。
将A的析构函数设置为虚析构函数时的代码:
#include <iostream>
构造类C的对象时,因为C继承于B,B继承于A,且在B类中内嵌了D的对象,所以创建C的对象时,先调用A的构造函数,然后再调用内嵌对象d的构造函数,然后调用B的构造函数,然后调用C的构造函数,然后依次反向调用析构函数。当类之间存在继承关系时,创建对象时总是从最远(最里层)的类开始创建。
2、给上题A类增加一虚函数func,并要求B/C派生类也提供该函数实现,并实验分别以指针、引用
cout<<"------------指针对象方式访问----------------"<<endl;
A *aa = new C;
aa->func();
cout<<"------------引用对象方式访问----------------"<<endl;
A &aaa = c;
aaa.func();
return 0;
public:
A(){cout<<"调用A的构造函数"<<endl;}
~A(){cout<<"调用A的析构函数"<<endl;}
};
class B:public A
{
public:
B(){cout<<"调用B的构造函数"<<endl;}
~B(){cout<<"调用B的析构函数"<<endl;}
};
int main(void)
void func(){cout<<"C::func()"<<endl;}
~C(){cout<<"调用C的析构函数"<<endl;}
};
int main(void)
{
C c;
cout<<"------------普通对象方式访问----------------"<<endl;
A a = c;
a.func();
{
A *p =new B;
delete p;
return 0;
}
运行结果:
结果分析:
当一个类作为基类时,应该将其析构函数声明为虚析构函数,这样做的目的是为了当基类的一个指针指向派生类的对象时,派生类的析构函数会被调用。
~B(){cout<<"调用B的析构函数"<<endl;}
};
class C:public B
{
public:
C(){cout<<"调用C的构造函数"<<endl;}
~C(){cout<<"调用C的析构函数"<<endl;}
};
int main(void)
{
C c;
return 0;
}
运行结果:
结果分析:
和普通对象方式访问该虚函数时的输出,并分析原因。
代码:
#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"调用A的构造函数"<<endl;}
virtual void func(){cout<<"A::func()"<<endl;}
~A(){cout<<"调用A的析构函数"<<endl;}
};
class D
{
public:
D(){cout<<"调用D的构造函数"<<endl;D::func();}
void func(){cout<<"D::func()"<<endl;}
~D(){cout<<"调用D的析构函数"<<endl;}
}
运行结果:
结果分析:
在主函数中创建A的对象,虽然A a = c,但是a是基类的对象,没有指向或者引用子类,所以当a调用func时,调用的是类A中的虚函数;而aa和aaa分别指向和引用了C的对象,所以其调用的是类C中的虚函数func(),而不是基类中的func()
3、给上题A类增加一虚函数func,并要求B/C派生类也提供该函数实现,并实验在不同类的构造函数、析构中
{
public:
B(){cout<<"调用B的构造函数"<<endl;}
void func(){cout<<"B::func()"<<endl;}
相关文档
最新文档