博学谷——让IT教学更简单,让IT学习更有效
第三章答案
1、基类/父类 派生类/子类 派生类 基类 2、基类派生类 3、Base::fun();
4、编绎时多态 运行时多态 5、C 6、AD 7、B 8、D 9、对 10、错 11、对 12、对
13、凡是基类所能解决的问题,公有派生类都可以解决。在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括以下情况:
(1)派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
(2)可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。
(3)派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。 14、实现多台的两个必要条件 (1)基类中有虚函数。
(2)一个基类的指针或引用指向一个派生类的对象。
C++中的虚函数一般是通过虚函数表实现的。先建立虚函数表,将各函数地址放入虚函数表中,再通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。
15、内部类能够访问外部类的成员,为外部类扩展了功能和接口,但并没有增加外部类的public方法,能够很好地实现代码隐藏。 另外,由于内部类和外部类位于不同的名字空间中,因此能够消除多重继承中存在的二义性问题。 16、
#include
class shape //抽象类shape {
public: virtual void getarea() = 0; virtual void getperim() = 0; };
class rectangle :public shape //矩形类 {
博学谷——让IT教学更简单,让IT学习更有效 int a, b, c; double s, p; public: rectangle(int a1, int b1, int c1) //矩形类构造函数 { a = a1; b = b1; c = c1; } void getperim() //实现纯虚函数getperim() { p = a + b + c; cout << \周长 \ } void getarea() //实现纯虚函数getarea() { p = (a + b + c) / 2.0; s = sqrt(p*(p - a)*(p - b)*(p - c)); cout << \面积 \ } };
class circle :public shape //圆形类继承自抽象类shape { float r, s, p; public: circle(float r1) //圆形类的构造函数 { r = r1; } void getperim() //圆形类实现纯虚函数getperim() { p = 2 * r*3.1415926; cout << \周长 \ } void getarea() //圆形类实现纯虚函数getarea() { s = r*r*3.1415926; cout << \面积 \ } };
void show(shape *p) { p->getarea();
博学谷——让IT教学更简单,让IT学习更有效 p->getperim(); }
void main() { shape *p; //基类指针 rectangle a(3, 4, 5); //构造矩形对象 circle b(10); //构造圆形对象 p = &a; //基类指针指向矩形 show(p); p = &b; //基类指针指向圆形 show(p); system(\}
第四章题目
一、填空题
1、运算符重载的本质是,它也是C++的一种体现,为用户提供了一个直观的接口,调用运
算符操作自定义数据类型其实就是调用运算符函数。 2、运算符重载时其函数名由构成。成员函数重载双目运算符是,左操作数是,右操作数是。 3、重载之后的运算符不能改变其和,也不能改变其操作数的个数及语法结构。
4、如果是单目运算符重载为类的成员函数,则要分为前置与后置运算符,如果是前置运算符,则它的操作数是函数调用者,函数没有参数;如果是后置单目运算符,则函数要带一个,这个整型参数不起任何作用,只是用来区分前置与后置。 二、选择题
5、下列关于插入运算符”<<”的重载的描述中,错误的是()。 A、运算符函数的返回值类型是ostream B、重载的运算符必须定义为类的成员函数 C、运算符函数的第一个参数的类型是ostream D、运算符函数有两个参数
6、现需要对list类重载”==”运算符,以下函数声明正确的是() A、friend bool operator== (const Student& st1, const Student& st2); B、bool operator== (const Student& st1); C、friend list operator== (const Student& st1);
D、bool operator== (const Student& st1, const Student& st2);
7、在重载一个运算符时,其参数表中没有任何参数,则下列描述中正确的是() A、作为友元函数重载的一元运算符 B、作为成员函数重载的一元运算符 C、作为友元函数重载的二元运算符 D、作为成员函数重载的二元运算符
8、下列关于运算符重载的描述中,正确的是( ) A、所有运算符都可以重载
B、通过重载,可以使运算符应用于自定义的数据类型 C、通过重载,可以创造原来没有的运算符
博学谷——让IT教学更简单,让IT学习更有效
D、通过重载,可以改变运算的优先级 三、判断题
9、运算符重载可以创建新运算符。
10、C++中有5个运算符不可以重载:类属关系运算符“.”、成员指针运算符“*”、作用域
运算符“::”、sizeof运算符和三目运算符“?:”。 11、有4个运算符必须重载为类的成员函数:赋值(=)、下标([])、调用(())、成员访问
箭头(->)。 12、
四、简答题
13、请阅读下面的程序,分析程序是否能通过编绎,如果不能写出原因;如果能,写出运行结果。
#include
class Point { int x, y; public: Point(int x = 0, int y = 0) { this->x = x; this->y = y; cout << \ } Point & operator++() { x++; y++; cout << \ return *this; } Point operator++(int) { Point temp; temp = *this; ++(this->x); ++(this->y); cout << \ return temp; } friend ostream & operator<<(ostream &os, Point&p) { os << \ return os; }
相关推荐: