博学谷——让IT教学更简单,让IT学习更有效 char date[Max][10]; // 日期 int money[Max]; // 金额 int rest[Max]; // 余额 static int sum; // 累计余额 public: Bank(){ top = 0; } void bankin(char d[], int m) { strcpy(date[top], d); money[top] = m; sum = sum + m; rest[top] = sum; top++; } void bankout(char d[], int m) { strcpy(date[top], d); money[top] = -m; sum = sum - m; rest[top] = sum; top++; } void disp(); };
int Bank::sum = 0; void Bank::disp() { int i; //printf(\日期存入取出余额\\n\ cout << \日期存入取出余额\ for (i = 0; i void main() 博学谷——让IT教学更简单,让IT学习更有效 { } Bank obj; obj.bankin(\obj.bankin(\obj.bankout(\obj.bankout(\obj.disp(); system(\ 第三章题目 一、填空题 1、如果类α继承了类β,则类α称为类,而类β称为类。类的对象可作为类的对象处理。 2、派生类对象占用的空间中,的数据成员排列在前,的成员排列在后。 3、应在下列程序划线处填入的正确语句是() #include void fun() { cout<<\} }; class Derived:public Base{ void fun() ?? { ;//显式调用基类的函数fun() ?? cout<<\ } }; 4、C++中多态性包括两种多态性:和。 二、选择题 5、下列关于继承的描述中,错误的是( )。 A、基类的构造函数和析构函数不可被继承 B、派生类继承了基类的全部数据成员和除了构造、析构函数之外的所有成员函数。 C、派生类可以添加新成员,用于实现新功能;也可以舍弃继承于基类的成员,用于删除不需要的功能。 D、多个派生类可以继承自同一个基类。 6、下列关于继承权限的说法中,错误的是()。 A、基类的protected成员在派生类中仍然是protected的 B、基类的protected成员在public派生类中仍然是protected的 C、基类的protected成员在private派生类中是private的 博学谷——让IT教学更简单,让IT学习更有效 D、基类的protected成员不能被派生类的对象访问7、 7、有如下程序: #include A() { cout << ‘A’; } ~A() { cout << ‘C’; } }; class B: public A{ public: B() { cout << ‘G’; } ~B() { cout << ‘T’; } }; int main() { B obj; return 0; } 执行后的输出结果是( )。 A、GATC B、AGTC C、GACT D、AGCT 8、下列关于多重继承容易引起二义性的说法中,错误的是()。 A、多个基类中的成员同名时,派生类对象中会有多个副本 B、多个基类中的成员同名时,可以用作用域限定符来标识调用哪个基类的成员 C、派生类中定义了与基类同名函数,则基类函数将被隐藏 D、多重继承中派生类有多个基类,多个基类又可能由同一个基类派生,则在派生类中访问公共基类成员时就不会出现二义性 三、判断题 9、不管哪种继承方式,基类中的私有成员都会变成派生类中的不可访问成员。 10、基类与派生类对象之间具有赋值兼容的关系,可以进行类型间的转换。 11、多继承中,派生类的构造函数的执行顺序取决于定义派生类时所指定的各基类的顺序。 12、虚基类的派生生类对象中都会增加一个隐藏的“虚基类表指针”(vbptr)成员变量。 四、简答题 13、简单叙述派生类与基类的赋值兼容规则。 14、简述一下实现多态的两个必要条件,以及C++编译器是如何实现虚函数。 15、请简述在面向对象程序设计中,使用内部类的优点。 16、声明一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea( )函数计算对象的面积,GetPerim( )函数计算对象的周长。 博学谷——让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();