第八章 多态
1.单选题 (1).下列关于运算符重载的描述中,( D )是正确的。
(A) 可以改变参与运算的操作数个数 (B) 可以改变运算符原来的优先级 (C) 可以改变运算符原来的结合性 (D)不能改变原运算符的语义 (2).下列函数中,不能重载运算符的函数是( b )。
(A) 成员函数 (B) 构造函数 (C)普通函数 (D) 友员函数 (3).要求用成员函数重载的运算符是( A )。
(A) = (B) == (C) <= (D) ++ (4).要求用友员函数重载的运算符是( C )。
(A) = (B) [] (C) << (D)() (5).在C++中,要实现动态联编,必须使用(D)调用虚函数。
(A)类名
(B) 派生类指针
(C) 对象名
(D) 基类指针
(6).下列函数中,不能说明为虚函数的是( C )。
(A) 私有成员函数
(B) 公有成员函数
(C) 构造函数
(D) 析构函数
(7).在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( A )。
(A)相同
(B) 不同
(C) 相容
(D)部分相同
(8).C++中,根据(D)识别类层次中不同类定义的虚函数版本。
(A) 参数个数
(B) 参数类型
(C) 函数名
(D) this指针类型
(9).虚析构函数的作用是(C)。
(A) 虚基类必须定义虚析构函数 (C)
(B) 类对象作用域结束时释放资源 (D) 无意义
delete动态对象时释放资源
(10).下面函数原型中,( B )声明了fun为纯虚函数。
(A)void fun()=0;(B) virtual void fun()=0; (C)virtual void fun(); (D) virtual void fun(){ }; (11).若一个类中含有纯虚函数,则该类称为(C)。
(A) 基类
(B) 纯基类
(C) 抽象类
(D) 派生类
(12).假设Aclass为抽象类,下列正确的说明语句是(B)。
(A)Aclassfun(int ) ; (B) Aclass* p ; (C)int fun( Aclass ) ;(D) AclassObj ;
2.在C++中,使用类体系依靠什么机制实现程序运行时的多态?
【解答】
在C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。程序通过用同一个基类指针访问不同派生类的虚函数重载版本实现程序运行时的多态。C++的虚特性负责自动地在程序运行时把基类指针的关联类型转换成当前指向对象的派生类类型。
另外,抽象类机制提供了软件抽象和可扩展性的手段,实现运行时的多态性。
3.如果一个类的虚函数被声明为私有成员函数,会有语法错误吗?当它作为基类时,可以在应用类体系时实现动态联编吗?请你验证一下。 【解答】
没有语法错误。但在应用类体系时无法实现动态编联和多态。因为私有成员函数只在类内可见,在类外无法调用,无法在类外通过基类指针实现多态。
程序略。 4.虚函数和纯虚函数的区别是什么? 【解答】
虚函数定义时冠以关键字virtual,本身有实现代码,作用是引导基类指针根据指向对象调用类体系中不同重载版本函数。
纯虚函数是指在说明时代码“为0”的虚函数,即纯虚函数本身并没有实现代码,必须通过它的派生类定义实现版本。 5.阅读下列程序,写出运行结果。
#include
T() { a = 0; b = 0; c = 0; } T( int i, int j, int k ) { a = i; b =j; c = k; }
void get( int &i, int &j, int &k ) { i = a; j = b; k = c; } T operator* ( T obj ); private:
int a , b , c; };
T T::operator* ( T obj ) { T tempobj;
tempobj.a = a * obj.a; tempobj.b = b * obj.b; tempobj.c = c * obj.c; return tempobj; }
int main()
{ T obj1( 1,2,3 ), obj2( 5,5,5 ), obj3; int a , b , c;
obj3 = obj1 * obj2; obj3.get( a, b, c );
cout<<\
<<\ (obj2*obj3).get( a, b, c ); cout<<\
<<\} 【解答】
( obj1 * obj2 ): a = 5 b = 10 c = 15 ( obj2 * obj3 ): a = 25 b = 50 c = 75 6.阅读下列程序,写出运行结果。
#include
Vector(){ }
Vector(int i,int j) { x = i ; y = j ;
}
friend Vector operator+ ( Vector v1, Vector v2 ) { Vector tempVector ;
tempVector.x = v1.x + v2.x ; tempVector.y = v1.y + v2.y ; return tempVector ; }
void display()
{ cout << \ private:
int x , y ; };
int main()
{ Vector v1( 1, 2 ), v2( 3, 4 ), v3 ; cout << \ v1.display() ; cout << \ v2.display() ; v3 = v1 + v2 ;
cout << \ v3.display() ; } 【解答】
v1 = ( 1, 2 ) v2 = ( 3, 4 )
v3 = v1 + v2 = ( 4, 6 )
7.阅读下列程序,写出运行结果。
#include
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; } 【解答】
0 5 0 5
8.阅读下列程序,写出运行结果。
#include
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<<\};
class B : public Base { public: void fun()
{ cout << \ cout << \ } } ;
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 = 100 x=100 y=20 y=x/y=5
9.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。
【解答】
(1) 使用成员函数 #include
s(){ *str = '\\0'; } s( char *pstr )
{ strcpy( str,pstr );
}
char *gets() { return str;
}
s operator+( s obj ); private:
char str[10];