c++课后习题解答6-10 下载本文

#include #include class Person { public: Person(char *s) { name=new char[strlen(s)+1]; strcpy(name,s); } void Print() { cout<<\姓名: \ } protected: char *name; }; class Student:virtual public Person { public: Student(char *s,char *t):Person(s) { grad=new char[strlen(t)+1]; strcpy(grad,t); } void Print() { Person::Print(); cout<<\年级: \ } protected: char *grad; }; class Teacher:virtual public Person { public: Teacher(char *s,char *t):Person(s) { lesson=new char[strlen(t)+1]; strcpy(lesson,t); } void Print() { Person::Print(); cout<<\授课名: \ } protected: char *lesson; }; class StudentTeacher:public Student,public Teacher { public: StudentTeacher(char *p,char *q,char *r,char *s):Student(p,q),Teacher(p,r),Person(p) { Major=new char[strlen(s)+1];

26

strcpy(Major,s); } void Print() { Student::Print(); cout<<\专业方向:\ } protected: char *Major; };

void main() { Student stu(\马宁\级\ Teacher tea(\王新\高等代数\ StudentTeacher stutea(\刘力\级\数据结构\计算机软件\ stu.Print(); tea.Print(); stutea.Print();

}

2.设计一个程序,一行是信息,下一行画线,所画的线与信息行同长。例如,

C++ Programming

答: 编程如下:

#include #include class Line { public: Line(int i) { length=i; } void Show() { for(int i=0;i

27

cout<

void main() { MsgLine string1(\ string1.Show(); MsgLine string2(\ string2.Show(); }

8.6 简单回答下列问题

1. 在继承关系中,派生类中包含基类所有成员,基类是否也包含派生类的部分成员? 答:不包含。

2. 构造函数不能继承,派生类的构造函数中是否应包含直接基类的构造函数和所有间接

基类的构造函数?

签:派生类的构造函数中只包含直接基类的构造函数。

3. 派生类的析构函数中不包含直接基类的析构函数,对吗? 答:不对。

4. 派生类的对象可以给基类对象赋值吗?

答:一般情况下不可以,只有在公有继承的情况下可以。

5. 多重继承的二义性可以避免吗? 答:可以避免,通常使用类名限定。

第9章 多态性和虚函数

练习题9

9.1 判断题

√ 1.运算符重载是通过对已有的运算符重新定义操作功能来实现的,它是C++语言多态性的一种表现。

√ 2.所有的运算符都可以重载。

√ 3.运算符重载只可以是类的成员函数和友元函数,不可以是普通函数。

√ 4.运算符重载是通过函数来实现的,定义运算符重载函数时,函数名中要使用关键字

28

operator。

√ 5.用于类对象的运算符中只有取地址运算符(&)有默认的可以使用。 √ 6.运算符重载后,优先级、结合性和操作数都是不变的。 √ 7.重载运算符的函数也可以设置默认参数。 √ 8.使用成员函数方法和使用友元函数的方法所定义的重载运算符函数的参数个数是不相同的。

√ 9.静态联编和动态联编都是在编译时进行的,二者的区别仅是前者对非虚函数,后者对虚函数。

√ 10.只要是成员函数就可以说明为虚函数,因为虚函数是一种成员函数。

√ 11.虚函数有继承性,基类中说明的虚函数只要在它的派生类中与它名字相同的,一定是虚函数。

√ 12.虚函数可以被类的对象调用,也可以被类的对象指针和对象引用调用。 √ 13.动态联编指的是在运行期间来选择不同类的虚函数。 √ 14.虚函数是实现动态联编的充分必要条件。

√ 15.含有纯虚函数的类称为抽象类,与抽象类相对应的是具体类。 √ 16.抽象类可以定义对象,不可以定义对象指针和对象引用。 √ 17.成员函数和构造函数调用虚函数都可以实现动态联编。

√ 18.析构函数可以说明为虚函数,而构造函数说明为虚函数没有意义。 √ 19.抽象类的派生类一定是具体类。

√ 20.一个抽象类中可以包含有多个纯虚函数,一个派生类中也可以包含多个虚函数。 9.2 单选题

1.下列运算符中,不可以重载的是( D )。 A.&& B.& C.[ ] D.?:

2.下列关于运算符重载的描述中,错误的是( B )。 A.运算符重载不改变优先级

B.运算符重载后,原来运算符操作不可再用 C.运算符重载不改变结合性

D.运算符重载函数的参数个数与重载方式有关

3.下列关键字中,用来说明虚函数的关键字是( C )。 A.inline B.operator C.virtual D.public 4.下列的成员函数中,纯虚函数是( A )。 A.virtual void f1() = 0 B.void f1() = 0; C.virtual void f1() {} D.virtual void f1() == 0; 5.含有一个或多个纯虚函数的类称为( A )。 A.抽象类 B.具体类 C.虚基类 D.派生类 6.下列关于虚函数的描述中,错误的是( C )。 A.虚函数是一个成员函数 B.虚函数具有继承性

C.静态成员函数可以说明为虚函数

D.在类的继承的层次结构中,虚函数是说明相同的函数 7.下列各种类中,不能定义对象的类是( B )。 A.派生类 B.抽象类 C.嵌套类 D.虚基类 8.下列关于抽象类的描述中,错误的是( D )。

29

A.抽象类中至少应该有一个纯虚函数 B.抽象类可以定义对象指针和对象引用 C.抽象类通常用作类族中最顶层的类 D.抽象类的派生类必定是具体类

9.一个类的层次结构中,定义有虚函数,并且都是公有继承,在下列情况下,实现动态联编的是( D )。

A.使用类的对象调用虚函数

B.使用类名限定调用虚函数,其格式如下:<类名>::<虚函数名> C.使用构造函数调用虚函数 D.使用成员函数调用虚函数

10.下列关于动态联编的描述中,错误的是( C )。

A.动态联编是函数联编的一种方式,它是在运行时来选择联编函数的 B.动态联编又可称为动态多态性,它是C++语言中多态性的一种重要形式 C.函数重载和运算符重载都属于动态联编 D.动态联编只是用来选择虚函数的

9.3 填空题

1.C++语言多态性主要表现在动态联编、 函数 重载和 运算符 重载。 2.运算符重载函数的两种主要方式是 成员 函数和 友元 函数。

3.静态联编支持的多态性称为 静态 多态性,它是在 编译 时进行的;动态联编支持的多态性称为 动态 多态性,它是在 运行 时进行的。

4.虚函数是一种 非静态 成员函数。说明方法是在函数名前加关键字 virtual 。虚函数具有 继承 性,在基类中被说明的虚函数,具有相同说明的函数在派生类中自然是虚函数。

6. 含有 纯虚函数 的类称为抽象类。它不能定义对象,但可以定义 对象指针和 对象引用 。

9.4 分析下列程序的输出结果 1.

#include class Matrix {

public:

Matrix(int r,int c) {

row=r; col=c;

elem=new double[row*col]; }

double & operator ()(int x,int y) { return elem[x*col+y]; } ~Matrix()

{ delete []elem; } void print(int i)

{ cout<

double *elem; int row,col; };

void main() {

Matrix m(3,4); for(int i=0;i<3;i++) for(int j=0;j<4;j++) m(i,j)=4*i+j; for(i=0;i<3;i++)

for(int j=0;j<4;j++)

30