面向对象程序设计复习试题
语法扩充
选择题
在C++中用( D )能够实现将参数值带回。
a)数组 b)指针 c)引用 d)上述ABC都可
考虑函数原型void test(int a,int b=7,char *ch="*"),下面的函数调用中,属于不合法调用的是:( C )
A)test(5) B)test(5,8) C)test(6,"#") D)test(0,0,"*");
已知: int m=10;下列表示引用的方法中,正确的是:( C )
A)int &Z; B)int &t=10; C)int &X=m; D)float &f=&m;
下列不是函数重载所要求的条件是:( D )
A)函数名相同 B)参数个数不同
C)参数类型不同 D)函数返回值类型不同
在C++中执行以下4条语句后输出rad值为:( C )
static int hot=200;
int &rad=hot;
hot=hot+100;
cout< A) 0 B) 100 C) 300 D) 200 系统在调用重载函数时,不能作为确定哪个重载函数被调用的依据是:( D ) A)参数个数 B)参数类型 C)函数名称 D)函数的返回值类型 对C++语言和C语言的兼容性,描述正确的是:( A ) A)C++兼容C B)C++部分兼容C C)C++不兼容C D)C兼容C++ 在C++中使用流进行输入输出,其中用于屏幕输出的对象是:( C ) A)cerr B)cin C)cout D)cfile 对使用关键字new所开辟的动态存储空间,释放时必须使用( C ) A)free B)create C)delete D)realse 在函数调用时,如某一默认参数要指明一个特定值,则有( A ) A)其之前所有参数都必须赋值 B)其之后所有参数都必须赋值 C)其前、后所有参数都必须赋值 D)其前、后所有参数都不必赋值 下列哪个类型函数不适合声明为内联函数( A ) A)函数体语句较多 B)函数体语句较少 C)函数执行时间较短 D)函数执行时间过长 int Func(int,int);不可与下列哪个函数构成重载( B ) A)int Func(int,int,int); B)double Func(int,int); C)double Func(double,double); D)double Func(int,double); 下面的哪个保留字不能作为函数的返回类型( C ) A)void B)int C)new D)long 一个函数功能不太复杂,但要求被频繁调用,选用( A )。 A. 内联函数 B. 重载函数 C. 递归函数 D. 嵌套函数 已知函数f的原型为:void f (int&a,char*b);变量s,t的定义是:int s;char t[ ]="ABCD"; 把s和t分别作为第一参数和第二参数来调用函数f,正确的调用语句是( C ) A f(&s,&t); B f(&s,t); C f(s,t); D f(s,&t); 若定义cin>>str; 当输入 Microsoft Visual Studio ! 所得结果是str=(B)。 A、 Microsoft Visual Studio ! B、 Microsoft C、 Microsoft Visual D、 Microsoft Visual Studio .函数模板(C)。 A、代表某一具体函数 B、与模板函数是同一个函数 C、与某一个具体的数据类型连用 D、是模板函数实例化的结果 在C++中,关于下列设置参数默认值的描述中,正确的是(C) A、不允许设置参数的默认值 B、设置参数默认值只能在定义函数时设置 C、设置参数默认值时,应该是先设置右边的再设置左边的 D、设置参数默认值时,应该全部参数都设置 下列表示引用的方法中,(A)是正确的。 已知: k=1000; A、int &x=k; B、char &y; C、int &z=1000; D、float &t=&k; 有如下模板定义: template 在下列对fun的调用中,错误的是:( C ) A)fun(2,8) B)fun, C)fun,8) D)fun (‘2’,’8’) 通常情况下,函数模板中的类型参数个数不能是( A ) A)0个 B)1个 C)2个 D)3个 填空题 1、假定有如下定义:int x;,若要将整型变量y定义为变量x的引用,则应使用的定义语句是_int &y=x;________。 具有相同函数名但具有不同参数表的函数称为重载函数。' 2、在进行函数调用时,将把参数的值传递给值参数,把参数的_地址_传递给引用参数。 3、执行完下列三条语句后,指针变量c指向__b___。 Int a,b,*c=&a; int *&p=c; p=&b; 4、假设有如下函数定义:void Fun(int x,int y=100);则语旬Fun(5)语句__ Fun(5,100)_等价。 5、在一个C++程序中,每个变量都必须遵循__先定义后使用__的原则。 6、下面是一个求数组元素之和的程序。主程序中定义并初始化了一个数组,然后计算该数组各元素之和,并输出结果。 函数TotalSum 计算数组元素之和。请完成下列程序。 #include <> __int Totalsum(int array[],int len)__ ; void main() { int a[5]={2,3,6,8,10}; __int Total ___; Total =Totalsum(a,5); cout<<"Sum of array:"< } int Totalsum(int array[],int len) { ____int sum =0____ ; for(int I=0;____I ____ sum += array[I]_____ ; return sum; } 7、下面的函数Fun未使用中间变量实现了对两个数的交换,请完成下列函数的定义。 Void Fun (int &x,int &y) { x+ = y; y =___x-y____ ; __x = x - y_____ ; } 8、定义一个函数时,若只允许函数体访问形参的值而不允许修改它的值,则应把该形参声明为__常量__,即在该形参声明的前面加上__const__关键字进行修饰。 9、在一个函数的定义或声明前加上关键字__inline__时,该函数就声明为内联函数。 简答题 A、.内联函数的含义 在函数前加上关键字inline说明了一个内联函数,这使一个函数在程序行里进行代码扩展而不被调用。这样的好处是减少了函数调用的开销,产生较快的执行速度。但是由于重复编码会产生较长代码,所以内联函数通常都非常小。如果一个函数在类说明中定义,则将自动转换成内联函数而无需用inline说明。 B、.函数重载的含义 在同一作用域范围内,相同的函数名通过不同的参数类型或参数个数可以定义几个函数,编译时编译器能够识别实参的个数和类型来决定该调用哪个具体函数。需要注意的是,如果两个函数仅仅返回类型不同,则编译时将会出错,因为返回类型不足以提供足够的信息以使编译程序判断该使用哪个函数。所以函数重载时必须是参数类型或者数量不同。 C、引用与指针的区别 D、内联函数使用上的限制 E、定义带默认参数值函数的规则 F、指针与常量的关系 程序阅读题 1)写出下列程序的运行结果。 #include <> void main() { int x; int &p=x; x=10; p=x+10; cout< } 结果:20,20 2)写出下列程序的运行结果。 #include <> int f(int a) { return ++a; } int g(int &a) { return ++a; } void main() { int m=0,n=0; m+=f(g(m)); n+=f(f(n)); cout<<"m="< cout<<"n="< } 结果: m=3 n=2 3) 写出下列程序的运行结果。 #include <> void Fun() { int num=20; cout<<"The Fun's num is"< } void main() { int num=10; cout<<"The main's num is "< Fun(); { int num=30; cout<<"The Field's num is "< } cout<<"The main's num is "< } 结果: The main's num is 10 The Fun's num is20 The Field's num is 30 The main's num is 10 类和对象 选择题 下列的各类函数中,不是类的成员函数。( C ) A)构造函数 B)析构函数 C)友元函数 D)拷贝初始化构造函数 作用域运算符“::”的功能是:( B ) A)标识作用域的级别的 B)指出作用域的范围的 C)给定作用域的大小的 D)标识成员是属于哪个类的 已知:print()函数是一个类的常成员函数,它无返回值,下列表示中,是正确的。( A )A)void print()const; B)const void print(); C)void const print(): D)void print(const); 在类定义的外部,可以被访问的成员有( C ) A)所有类成员 B)private的类成员 C)public的类成员 D)public或private的类成员 关于类和对象不正确的说法是:( C ) A)类是一种类型,它封装了数据和操作 B)对象是类的实例 C)一个类的对象只有一个 D)一个对象必属于某个类 在C++中实现封装是借助于( B ) A)枚举 B) 类 C) 数组 D)函数 定义析构函数时,应该注意:( C ) A)其名与类名完全相同 B)返回类型是void类型 C)无形参,也不可重载 D)函数体中必须有delete语句 类clase CC1的说明如下,错误的语句是:( A ) clase CC1{ int a=2;于类模板的说法正确的是:( B ) A)类模板的主要作用是生成抽象类 B)类模板实例化时,编译器将根据给出的模板实参生成一个类 C)在类模板中的数据成员具有同样类型 D)类模板中的成员函数没有返回值 .以下关键字不能用来声明类的访问权限的是:( C ) A)public B)private C)static D)protected .类的私有成员可在何处访问( D ) A)通过子类的对象访问 B)本类及子类的成员函数中 C)通过该类对象访问 D)本类的成员函数中 .如果没有为一个类定义任何构造函数的情况下,下列描述正确的是:( A )A)编译器总是自动创建一个不带参数的构造函数 B)这个类没有构造函数 C)这个类不需要构造函数 D)该类不能通过编译 .一个类可包含析构函数的个数是:( B ) A)0个 B)1个 C)0个或1个 D)0个或多个 .一个类可包含构造函数的个数是:( D ) A)0个 B)0个或1个 C)0个或多个 D)1个或多个 .this指针存在的目的是:( B ) A)保证基类公有成员在子类中可以被访问 B)保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码 C)保证基类保护成员在子类中可以被访问 D)保证基类私有成员在子类中可以被访问 .下列关于类的权限的描述错误的是:( A ) A)类本身的成员函数只能访问自身的私有成员 B)类的对象只能访问该类的公有成员 C)普通函数不能直接访问类的公有成员,必须通过对象访问 D)一个类可以将另一个类的对象作为成员 .设类A将其它类对象作为成员,则建立A类对象时,下列描述正确的是:( B )A)A类构造函数先执行 B)成员构造函数先执行 C)两者并行执行 D)不能确定 .假定有类AB,有相应的构造函数定义,能正确执行“AB a(4),b(5), c[3] , *p[2]={&a,&b};”语句,请问执行完此语句后共调用该类构造函数的次数为( C ) A)3 B)4 C)5 D)6 拷贝构造函数的作用是( C )。 A. 进行数据类型的转换 B. 用对象调用成员函数 C. 用对象初始化对象 D. 用一般类型的数据初始化对象 下列静态数据成员的特性中,错误的是( D )。 A.静态数据成员的声明以关键字static开头 B. 静态数据成员必须在文件作用域内初始化 C. 引导数据成员时,要在静态数据成员前加(类名)和作用域运算符 D. 静态数据成员不是类所有对象共享的 通过指针访问类对象成员的方法是( D )。 A. :: B. ; C. . D. -> 静态成员函数没有( B )。 A.返回值 B. this指针 C. 指针参数 D. 返回类型 在下列关键字中,用于说明类中公有成员的是( A )。 A.public; B.private; C.protected; D.friend 不是构造函数的特征( D )。 A.构造函数的函数名与类名相同; B. 构造函数可以重载; C. 构造函数可以设置缺省参数; D. 构造函数必须指定类型说明。 是析构函数的特征( A )。 A.一个类中只能定义一个析构函数; B. 析构函数名与类名不同; C. 析构函数的定义只能在类体内; D. 析构函数可以有一个或多个参数。 关于成员函数特征的下述描述中,( A )是错误的。 A.成员函数一定是内联函数; B. 成员函数可以重载; C. 成员函数可以设置参数的缺省值; D. 成员函数可以是静态的。 下述静态数据成员的特性中,( D )是错误的。 A.说明静态数据成员时前边要加修饰符static; B.静态数据成员要在类体外进行初始化; C.引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符; D.静态数据成员不是所有对象所共用的。 填空题 1、在撤销类的对象时,C++程序将自动调用该对象的__析构___函数。 2、类中的构造函数是一个特殊的成员函数,它由类的对象__自动_调用,它的作用是___为对象分配内存,数据成员初始化___。 3、对类中的成员函数和属性的访问是通过__public__、__protected__和___private__这 3个关键字来控制的。 4、 __delete__运算符删除new运算符所动态分配的内存空间。 5、假定用户没有给一个名为MyClass的类定义析构函数,则系统为其定义的默认析构函数形式为__MyClass()__。 6、类中构造函数有__一个或多__个,析构函数有___一___个。 7、类是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的___数据成员___ ,共同行为被描述为类中的__成员函数__。 8、若要把类FriendClass定义为类MyClass的友元类,则应在类MyClass的定义中加入语句_friend class FriendClass;___。 9、在结构定义中,数据和成员函数默认权限是__public__。在类定义中,数据和成员函数默认权限是__private___。 10、在下面程序的横线处填上适当的语句,使类型该程序执行结果为10。 #include <> class MyClass { pub1ic: ___ MyClass ( int a ) {_x = a; }____C++中,类与类之间的继承关系具有( C )A)自反性 B)对称性 C)传递性 D)反对称性 .在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制 B)保持不变 C)受保护 D)不受保护 .按解释中的要求在下列程序划线处填入的正确语句是:( C ) #include <> class Base{ public: void fun(){cout<<"Base::fun"< }; class Derived:public Base{ public: void fun() { 保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C ) A)受限制 B)保持不变 C)受保护 D)不受保护 .下面描述中,表达错误的是:( B ) A)公有继承时,基类中的public成员在派生类中仍是public的 B)公有继承时,基类中的private成员在派生类中仍是private的 C)公有继承时,基类中的protected成员在派生类中仍是protected的 D)私有继承时,基类中的public成员在派生类中是private的 .下列虚基类的声明中,正确的是:( B ) A)class virtual B: public A B)class B: virtual public A C)class B: public A virtual D)virtual class B: public A .C++设置虚基类的目的是( A ) A)消除二义性 B)简化程序 C)提高运行效率 D)减少目标代码 class X{ int a; public: X(int x=0){a=x;} }; class Y:public X{ int b; public : Y(int x=0,int y=0):X(y)){ b=x;} }; 下列语句组中出现语法错误的是(D) A. X *pa=new Y(1,2); a1=Y(1,3); b1(2,3); X &a3=b1; a4(10);Y b2=a4; class Base { public: int i; Base(int t) : i ( t ) { } }; class Derived: protected Base { Base b; int j; public: Derived (int t); }; 在构造函数Derived的下列定义中,正确的是(B ) A. Derived : : Derived (int t) : b(t), j(t) { } B. Derived : : Derived (int t) : b(t), Base(t), j(t) { } C. Derived : : Derived (int t) : Base(t), j(t) { } D. Derived : : Derived (int t) : i(t), b(t), j(t) { } .在哪种派生方式中,派生类可以访问基类中的protected成员(B ) A)public和private B)public、protected和private C)protected和private D)仅protected 在C++中,类与类之间的继承关系具有(C ) A) 自反性 B) 对称性 C) 传递性 D) 反对称性 下列关于类的继承描述中,(A )是错误的 A) 派生类可以访问基类的所有数据成员,也能调用基类的所有成员函数 B) 派生类也是基类,但基类不一定具有派生类的全部属性和方法 C) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法 D) 一个基类可以有多个派生类,一个派生类可以有多个基类 .当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A) public成员 B) private成员 C) protected成员 D) 友元 当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( B )A) public成员 B) private成员 C) protected成员 D) 友元 不论派生类以何种方法继承基类,都不能使用基类的(B ) A) public成员 B) private成员 C) protected成员 D) public成员和protected成员 在创建派生类对象时,构造函数的执行顺序是(D) A) 对象成员构造函数、基类构造函数、派生类本身的构造函数 B) 派生类本身的构造函数、基类构造函数、对象成员构造函数 C) 基类构造函数、派生类本身的构造函数、对象成员构造函数 D) 基类构造函数、对象成员构造函数、派生类本身的构造函数 下列虚基类的声明中,正确的是( D )。 A)class virtual B:public A B)virtual class B:public A C)class B:public A virtual D)class B:virtual public A 下面叙述错误的是(A )。 A)基类的protected成员在派生类中仍然是protected的 B)基类的protected成员在public派生类中仍然是protected的 C)基类的protected成员在private派生类中是private的 D)基类的protected成员不能被派生类的对象访问 下列说法中错误的是(A )。 A) 保护继承时基类中的public成员在派生类中仍是public的 B)公有继承时基类中的private成员在派生类中仍是private的 C)私有继承时基类中的public成员在派生类中是private的 D)保护继承时基类中的public成员在派生类中是protected的 关于多继承二义性的描述中,错误的是(B )。 A)一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性 B)解决二义性的最常用的方法是对成员名的限定法 C)基类和派生类中同时出现的同名函数,也存在二义性问题 D)一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,可能出现二义性 下面叙述错误的是(C )。 A)派生类可以使用private派生 B)对基类成员的访问必须是无二义性的 C)基类成员的访问能力在派生类中维持不变 D)赋值兼容规则也适用于多继承的组合 派生类的构造函数的成员初始化列表中,不能包含(C )。 A)基类的构造函数 B)派生类中子对象的初始化 C)基类中子对象的初始化 D)派生类中一般数据成员的初始化 下面(B )的叙述不符合赋值兼容规则。 A)派生类的对象可以赋值给基类的对象 B)基类的对象可以赋值给派生类的对象 C)派生类的对象可以初始化基类的引用 D)派生类的对象的地址可以赋值给指向基类的指针 .下列虚基类的声明中,正确的是:( B ) A)class virtual B: public A B)class B: virtual public A C)class B: public A virtual D)virtual class B: public A .C++设置虚基类的目的是( A ) A)消除二义性 B)简化程序 C)提高运行效率 D)减少目标代码 填空题 1、垂直访问时,保护成员的访问控制权限与_公有__成员相同。 2、利用继承能够实现_代码复用__。这种实现缩短了程序的开发时间,促使开发人员复用已经测试和调试好的高质量软件。 3、派生类对基类的继承有三种方式:__public__、___protected__ 和___private__。 4、多继承情况下,派生类的构造函数的执行顺序取决于__定义__派生类时所指定的各基类的顺序。 5、 C++提供的_多继承__机制允许一个派生类继承多个基类,即使这些基类是相互无关的。 6、派生类可以调用其_定义___中不具备的数据和操作。 7、对基类数据成员的初始化必须在派生类构造函数中的__初始化列表___处执行。 8、如果类Alpha继承了类Beta,则类Alpha称为__派生__类,类Beta称为__基__类。 9、己知下面的程序框架,按注释中的提示补充细节。 #include <> class planet { protected: double distance;___< cout< cout< } private: double k; }; void main() { Line obj,,,; (); } 15、类继承中,缺省的继承方式是__private___。 16、当用protected继承从基类派生→个类时,基类的public成员成为派生类的__protected__成员,protected成员成为派生类的_____protected____成员。 18、 __公有派生__类的对象可作为____基___类的对象处理。 19、指向基类的对象的指针变量也可以指向__公有派生类_的对象。 20、类之间的”有”关系代表__组合___,”是”关系代表__继承__。 简答题 A、派生类的定义及其特点 B、单继承和多继承的概念及其关系 C、继承方式的种类及其各自的特点 D、在继承中构造函数和析构函数的调用规则 F、赋值兼容原则 G、类模板和模板类的含义及其关系 读程序题 1、写出下列程序的运行结果。 #include <> class Base { public: void Who(){cout<<"class Base"< }; class Derived1:public Base { public: void Who(){cout<<"class Derived1"< }; class Derived2:public Base { public: void Who(){cout<<"class Derived2"< }; void main() { Base obj1,*p; Derived1 obj2; Derived2 obj3; p=&obj1; p->Who(); p=&obj2; p->Who(); p=&obj3; p->Who(); (); (); } 答案: class Base class Base class Base class Derived1 class Derived2 2、写出下列程序的运行结果。 #include <> class instrument { public: void display() const{cout<<"instument::display."< class piano:public instrument { public: void display() const{cout<<"piano::display."< class guitar:public instrument { public: void display() const{cout<<"guitar::display."< void tone(instrument & I) { (); }; void main() { guitar guitar1; tone(guitar1); piano piano1; tone(piano1); } 答案 instument::display. instument::display. 3、写出下列程序的运行结果。 #include <> class A { public: A(char i){cout<<"A's cons."< ~A(){cout<<"A's des."< }; class B:virtual public A { public: B(char i,char j):A(i){b = j; cout<<"B's cons."< private: char b; }; class C:virtual public A { public: C(char i,char j):A(i) { cout<<"C's cons."< } ~C(){cout<<"C's des."< }; class D:public B,public C { public: D(char i,char j,char k,char s,char m,char n) :C(k,s),B(i,j),A(i),aa(m){cout<<"D's cons."< ~D(){cout<<"D's des."< private: A aa; }; void main() { D obj('a','b','c','d','e','f'); } 答案: A's B's C's A's D's cons. D's des. A's des. C's des. B's des. A's des. 类的多态性 选择题 .实现运行时的多态性采用( D ) A)重载函数 B)构造函数 C)析构函数 D)虚函数 .在派生类中重新定义虚函数时,必须在下列哪方面与基类保持一致。(A ) A)参数类型 B)参数名字 C)操作内容 D)赋值 .当一个类的某个函数被说明为virtual时,在该类的所有派生类中的同原型函数(A ) A)都是虚函数 B)只有被重新说明时才是虚函数 C)都不是虚函数 D)只有被重新说明为virtual时才是虚函数 .通过下述哪一项调用虚函数时,采用动态联编。(A ) A)对象指针 B)对象名 C)成员名限定 D)派生类名 下面描述中,正确的是(B D )(两个答案) A) 虚函数是没有实现的函数 B) 纯虚函数的实现在派生类中 C) 抽象类是没有纯虚函数的类 D) 抽象类指针可以指向不同的派生类对象 若一个类中含有纯虚函数,则该类称为(D ) A) 基类 B) 纯基类 C) 派生类 D) 抽象类 假设A为抽象类,下列声明(B )是正确的 A) A fun(int); B) A *p; C) int fun(A); D) A Obj; 在C++中,要实现动态联编,必须使用(D )调用虚函数 A) 类名 B) 派生类指针 C) 对象名 D) 基类指针 下列函数中,可以作为虚函数的是(C D)(两个答案) A) 普通函数 B) 构造函数 C)成员函数 D) 析构函数 在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(B ) A) 不同 B) 相同 C) 相容 D) 部分相同 下面函数原型声明中,(C )声明了fun为普通虚函数 A) void fun()=0; B) virtual void fun()=0; C) virtual void fun(); D) virtual void fun(){}; 在下面四个选项中, (A)是用来声明虚函数的。 A)virtual B)public C)using D)false 在下面程序中,A、B、C、D四句编译时出现错误的是(C)。 Class A______ Derived's cons. Derived's des. Base's des. 根据结果将程序补充完整。 #incude <> class Base { public: Base(){cout<<"Base's cons."< __virtual ~Base()__{cout<<"Base's des." }; class Derived:public Base { public: Derived(){cout<<"Derived's cons."< ~Derived(){cout<<"Derived's des."< }; void main() { Base *Ptr=__new _ Derived()_ delete ptr; } 8、抽象类不能__定义对象,但可以_声明指针或引用__作为参数类型,函数返回类型或显式转换类型。 9、根据不同的输出结果,在函数Tone中填入正确的语句。 #include <> class Instrument { public: virtual void Print() const{cout<<"Instrument:Print"< }; class Piano:public Instument { public: void Print() const{cout<<"Piano::Print< }; class Guitar :public InstruIment { pub1ic: void Print() const{cout<<"Guiur::Print"< }; void Tone(__Instrument obj__)< } }; < } }; void fun(__convert& f____) { (); } void main() { l_to_g lgobj(4); f_to_c fcobj(70); fun(lgobj); fun(fcobj); } 12、下列程序的运行结果如下: Derive1's Print() called. Derive2's Print() caIIed. 根据结果将程序补充完整。 #include <> class Base { public: Base(int I){b=I;} __ virtual Print()=0; ____ protected: int b; } class Derive1:public Base { public: __ Derive1(int& I):Base(I){} ___ void Print() { cout<<"Derive1's Print() called."< } }; class Derive2:public Base { public: Derive2(int I):Base(I){} void Print(){cout<<“Derive2’s Print() called.”< }; void fun(__Base *obj ____) { obj->Print(); }; void main() { Derive1 *d1=new Derive1(1); Derive2 *d2=new Derive2(2); fun(d1); fun(d2); } 13、在一个成员函数内调用一个虚函数时,对该虚函数的调用进行_动态__联编。 14、带有__纯虚函数__的类称为抽象类,它只能作为__基类__来使用。 简答题 A、成员函数重载与虚函数的区别 B、静态联编和动态联编的含义 C、纯虚函数和抽象类的定义及其关系 D、抽象类的特点 读程序题 1、写出下列程序的运行结果。 #include <> class Base { public: Base(int i){x=i;cout<<"Base:"< virtual ~Base(){cout<<"~Base:"< private: int x; }; class Derived :public Base { public: Derived(int i,int j):Base(i){y=j;cout<<"Derived:"< private: int y; }; void main() { Base *b1=new Base(15); delete b1; Base *b2=new Derived(20,25); delete b2; } 答案 Base:15 ~Base:15 Base:20 Derived:25 ~Derived:25 ~Base:20 2、阅读下列程序,回答后面提出的问题。 #include <> class Base { public: Base():x(0),y(0){} Base(int I,int j):x(I),y(j){} int GetX() const{return x;} int GetY() const{return y;} virtual void Print() const{cout<<"x="< virtual ~Base(){Print();} private: int x,y; }; class Derived :public Base { public: Derived():z(0){} Derived(int I,int j,int k):Base(I,j),z(k){} void Print() const {cout<<"x+z="< private: int z; }; void main() { Base *d1=new Derived; d1->Print(); Base *d2=new Derived(10,20,30); d2->Print(); delete d2; delete d1; } 答案 x+z=0 y+z=0 x+z=40 y+z=50 x+z=40 y+z=50 x=10 y=20 x+z=0 y+z=0 x=0 y=0 3、阅读下列程序,回答后面提出的问题。 #include <> class Vehicle { public: void SetColor(int c){color=c;} virtual void Move(){cout<<"Vehicle moving."< private: