继承第一次实验
2-1
一个类的私有成员 (2分)
- 只能被该类的成员函数访问
- 只能被该类的成员函数和友元函数访问
- 只能被该类的成员函数、友元函数和派生类访问
- 以上答案都不对
正确答案:B
解析:
派生类中父类的私有成员为不可访问。
2-2
以下关于C++语言中继承的叙述中,错误的是( )。 (2分)
- 继承是父类和子类之间共享数据和方法的机制
- 继承定义了一种类与类之间的关系
- 继承关系中的子类将拥有父类的全部属性和方法
- 继承仅仅允许单继承,即不允许一个子类有多个父类
正确答案:D
C++允许单继承,允许单继承也允许多继承。
2-3
继承机制的作用是 (2分)
- 信息隐藏
- 数据封装
- 定义新类
- 数据抽象
正确答案:C
解析:
继承之后,形成一个新类。
2-4
在公有继承的情况下,在派生类中能够访问的基类成员包括 (2分)
- 公有成员
- 保护成员
- 公有成员、保护成员和私有成员
- 公有成员和保护成员
正确答案:D
2-5
派生类继承基类的方式有 (2分)
- public
- private
- protected
- 以上都对
正确答案:D
2-6
在c++中,类之间的继承关系具有( )。(2分)
- 自反性
- 对称性
- 传递性
- 反对称性
正确答案:C
2-7
下列关于类的继承描述中,( )是正确的。(2分)
- 派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。
- 派生类也是基类,所以它们是等价的。
- 派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。
- 一个基类可以有多个派生类,一个派生类可以有多个基类。
正确答案:D
解析:
A.派生类公有继承基类时,除了父类的私有成员其余都可以访问。
B.派生类可以充当它子类的基类,但是它们不等价。
C.派生类对象会建立基类的私有数据成员,只能通过父类中公有成员函数或保护成员函数来间接访问基类的私有数据成员。
2-9
下列程序的执行结果为 (5分)
#include <iostream> using namespace std; class A { public: A() { cout << "1"; } ~A() { cout << "2"; } }; class B: public A { public: B() { cout << "3"; } ~B() { cout << "4"; } }; int main() { B b; return 0; }
- 1234
- 1324
- 1342
- 3142
正确答案:C
解析:
创建对象b,在调用默认构造函数B()前会先调用基类中的默认构造函数A(),输出“13”,然后 该对象消亡时会先调用自己的析构函数,最后调用基类的析构函数,输出“42”。
注意:析构函数的调用顺序与构造函数相反。
2-10
下列关于派生类构造函数和析构函数的说法中,错误的是 (5分)
- 派生类的构造函数会隐含调用基类的构造函数
- 如果基类声明了带有形参表的构造函数,则派生类就应当声明构造函数
- 在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数
- 在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数
正确答案:D
解析:
A.派生类的构造函数在默认的情况下(没有初始化列表)时调用基类的默认构造函。
B.如果要调用基类中声明的带有形参表的构造函数,则派生类就应当声明构造函数 。
C.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数。
D.在销毁派生类对象时,先调用派生类的析构函数,再调用基类的析构函数。
2-11
建立派生类对象时, 3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数),这3种构造函数的调用顺序为 (5分)
- abc
- acb
- cab
- Cba
正确答案: A
解析:
基类的构造函数------>成员对象的构造函数------>派生类的构造函数
派生类的析构函数------>成员对象的析构函数------>基类的析构函数
2-12
下面叙述不正确的是 (3分)
- 基类的保护成员在派生类中仍然是保护的成员
- 基类的保护成员在公有派生类中仍然是保护的
- 基类的保护成员在私有派生类中仍然是私有的
- 对基类成员的访问必须是无二义性
正确答案:A
解析:
没有指明是什么类型的继承。
2-13
下列关于继承的描述中,错误的是( )。 (3分)
- 析构函数不能被继承
- 派生类是基类的组合
- 派生类的成员除了它自己的成员外,还包含了它的基类的成员
- 派生类中继承的基类成员的访问权限到派生类保持不变
正确答案:D
解析:
- 构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么。在整个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承。子类的构造函数会显示的调用父类的构造函数或隐式的调用父类的默认的构造函数进行父类部分的初始化。析构函数也一样。它们都是每个类都有的东西,如果能被继承,那就没有办法初始化了。
- 派生类是基类的组合。在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。
- 派生类的成员除了它自己的成员外,还包含了它的基类的成员。
- 派生类中继承的基类成员的访问权限到派生类中,除了基类的私有成员外,其他都不变。
2-14
下面关于类的继承与派生的程序,其输出结果是 (5分)
#include<iostream> using namespace std; class A { public: A(){cout<<"A";} }; class B { public: B(){cout<<"B";} }; class C:public A { B b; public: C(){cout<<"C";} }; int main(){ C obj; return 0; }
- CBA
- BAC
- ACB
- ABC
正确答案:D
解析:
基类的构造函数------>成员对象的构造函数------>派生类的构造函数
2-15
可以用p.a的形式访问派生类对象p的基类成员a, 其中a是 (3分)
- 私有继承的公有成员
- 公有继承的私有成员
- 公有继承的保护成员
- 公有继承的公有成员
正确答案:D
解析:
只有D中成员的访问属性是公有的。
2-16
下面关于类的继承与派生的程序,其输出结果是 (5分)
#include<iostream> using namespace std; class A { public: A(int i) { x = i; } void dispa() { cout << x << ','; } private: int x; }; class B: public A { public: B(int i) : A(i + 10) { x = i; } void dispb() { dispa(); cout << x << endl; } private: int x; }; int main() { B b(2); b.dispb(); return 0; }
- 10,2
- 12,10
- 12,2
- 2,2
正确答案:C
2-17
若obj是类D的对象,则下列语句中正确的是 (5分)
class B{ private: void fun1(){ } protected: void fun2(){ } public: void fun3(){ } }; class D : public B { protected: void fun4(){ } };
- obj.fun1();
- obj.fun2();
- obj.fun4();
- obj.fun3();
正确答案:D
2-18
下面关于继承和派生的构造函数和析构函数的程序,输出结果是 (5分)
#include<iostream> using namespace std; class AA { public: AA() { cout << "A"; } ~AA() { cout << "a"; } }; class BB: public AA { AA aa; public: BB() { cout << "B"; } ~BB() { cout << "b"; } }; int main() { BB bb; return 0; }
- AABaab
- AABbaa
- BAAaab
- BAAbaa
正确答案:B
4-1
write the output of the code below.
1.the output at //1 is 1 (2分)
2.the output at //2 is 2 (2分)
3.the output at //3 is 7 (2分)
4.the output at //4 is 0 (2分)
5.the output at //5 is 0 (2分)
#include <iostream> #include <string> using namespace std ; class Testing { private: string words; int number ; public: Testing(const string & s = "Testing") { words = s ; number = words.length(); if (words.compare("Testing")==0) cout << 1; else if (words.compare("Heap1")==0) cout << 2; else cout << 3; } ~Testing() { cout << 0; } void show() const { cout << number; } }; int main() { Testing *pc1 , *pc2; pc1 = new Testing ; //1 pc2 = new Testing("Heap1"); //2 pc1->show(); //3 delete pc1 ; //4 delete pc2 ; //5 return 0; }
如果有错误请在评论里告知,或者还有那些地方没有讲清可以在评论里提问,谢谢。