C++继承与多态习题

填空题

1.如果类α继承了类β,则类α称为  1 类,而类β称为 2 类。 3  类的对象可作为 4 类的对象处理,反过来不行,因为 5  。如果强制转换则要注意  6 

答案:(1)基类

(2)派生类

(3)派生类

(4)基类

(5)派生类有一些新成员

(6)只能派生类强制转换为基类

2.当用public继承从基类派生一个类时,基类的public成员成为派生类的  1 成员,protected成员成为派生类的  2  成员,对private成员是 3  。公有派生可以使其类的  4  ,所以公有派生是主流。

答案:(1)public成员

(2)protected成员

(3)不可访问

(4)接口不变

3.利用继承能够实现 1 。这种实现缩短了程序开发的时间,VC++中的 2 很好地体现了这一点。

答案:(1)代码的复用

(2)MFC编程

4.一个派生类只有一个直接基类的情况称为  1  ,而有多个直接基类的情况称为2  。继承体现了类的  3 概念,这在MFC中得到了很好表现,MFC中只采用了 4

答案:(1)单继承

(2)多重继承

(3)层次

(4)单继承

5.C++中多态性包括两种多态性:  1    2  。前者是通过 3 实现的,而后者是通过  4   5  来实现的。

答案:(1)编译时的

(2)运行时的

(3)函数和运算符的重载

(4)类继承关系

(5)虚函数

6.在基类中将一个成员函数说明成虚函数后,在其派生类中只要  1  2         3 完全一样就认为是虚函数,而不必再加关键字  4  。如有任何不同,则认为是 5 而不是虚函数。除了非成员函数不能作为虚函数外,  6 7         8 也不能作为虚函数。

答案:(1)同虚函数名

(2)同参数表

(3)同返回类型。如基类中返回基类指针,而派生类中返回派生类指针是允许的

(4)virtual

(5)重载

(6)静态成员函数

(7)内联函数

(8)构造函数

7.纯虚函数定义时在函数参数表后加 1 ,它表明程序员对函数  2 ,其本质是将指向函数体的指针定为 3

答案:(1)=0

(2)不定义

(3)NULL

简答题

构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?

答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是:

  1. 调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。
  2. 调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。
  3. 派生类的构造函数体中的操作。

什么叫派生类的同名覆盖(override)?

答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖(override)。

派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的调用?为什么?

答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。

为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的存储方式。

答:在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。虚基类(virtual base class)定义方式如下:

class 派生类名:virtual 访问限定符 基类类名{...};

class 派生类名:访问限定符 virtual 基类类名{...};

virtual 关键字只对紧随其后的基类名起作用。

如下派生:在职研究生类只有一个Person拷贝。

简单叙述派生类与基类的赋值兼容规则。

答:凡是基类所能解决的问题,公有派生类都可以解决。在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规则称赋值兼容规则。它包括以下情况:

  1. 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。
  2. 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。
  3. 派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。

在类中定义对象成员称为复合或嵌套,请对比复合与继承的异同之处。

答:成员对象是嵌套的概念,使用成员对象中的成员,只能直接访问(对象名加点号加成员名)公有成员。在类的成员函数中不能直接访问和处理成员对象的私有和保护成员,而要通过成员对象的接口去间接访问和处理。某些应用中,对象成员可以代替继承中的基类。

        基类在派生类中只能继承一个(间接基类不在讨论之中)不能同时安排两个,否则成员名即使使用域分辨符也会发生冲突,但如果一定要用两个,只能采用成员对象。所以采用成员对象更加灵活。两者不是对立的,而是互为补充的。

比较派生与模板各自的优点。

答:模板追求的是运行效率,而派生追求的是编程的效率。

通用性是模板库的设计出发点之一,这是由泛型算法和函数对象等手段达到的。为了运行的效率,类模板是相互独立的,即独立设计,没有使用继承的思想。对类模板的扩展是采用适配子(adapter)来完成的。应该说派生类的目标之一也是代码的复用和程序的通用性,最典型的就是MFC,派生类的优点是可以由简到繁,逐步深入,程序编制过程中可以充分利用前面的工作,一步步完成一个复杂的任务。

是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?

答:不是。实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。

为什么析构函数总是要求说明为虚函数?

答:在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。根据赋值兼容规则可以用基类的指针指向派生类对象,如果由该指针撤销派生类对象,则必须将析构函数说明为虚函数,实现多态性,自动调用派生类析构函数。我们总是要求将类设计成通用的,无论其他程序员怎样调用都必须保证不出错,所以必须把析构函数定义为虚函数

什么是抽象类?含有纯虚函数的类是抽象类吗?

答:若定义一个类,它只能用作基类来派生出新的类,而不能用来定义对象,则称为抽象类。含有纯虚函数的类是抽象类。

能否不提供源代码,做到用户自行把通用的软件转化为专用软件?怎样实现?

答:能不提供源代码,做到用户自行把通用的软件转化为专用软件。动态联编不一定要源代码,可以只有头文件和对象文件的.obj文件。软件开发商可在不透露其秘密的情况下发行.obj形式的软件,然后由程序员利用继承机制,从所购得的类中派生出新类。能与软件开发商提供的类一起运行的软件也能与派生类一起运行,并能通过动态联编使用这些派生类中重定义的虚函数。比如通用的财务软件可以转化为某公司的专用软件。

好的,我可以为你提供一个简单的继承多态的练习题,希望能帮助你巩固相关知识。 假设有一个图形类 Shape,其中包含一个纯虚函数 getArea(),用于计算该图形的面积。现在要定义两个子类,分别是矩形类 Rectangle 和圆形类 Circle。请完成以下任务: 1. 定义 Shape 类: ```c++ class Shape { public: virtual double getArea() = 0; // 纯虚函数 }; ``` 2. 定义 Rectangle 类,继承自 Shape 类,包含两个成员变量 width 和 height,以及实现 getArea() 函数的具体方法: ```c++ class Rectangle : public Shape { private: double width; double height; public: Rectangle(double w, double h) { width = w; height = h; } double getArea() { return width * height; } }; ``` 3. 定义 Circle 类,同样继承自 Shape 类,包含一个成员变量 radius,以及实现 getArea() 函数的具体方法: ```c++ class Circle : public Shape { private: double radius; public: Circle(double r) { radius = r; } double getArea() { return 3.1415926 * radius * radius; } }; ``` 4. 在主函数中创建一个 Shape 指针数组,分别指向一个 Rectangle 和一个 Circle 对象,并计算它们的面积: ```c++ int main() { Shape* shapes[2]; shapes[0] = new Rectangle(4, 5); shapes[1] = new Circle(3); for (int i = 0; i < 2; i++) { cout << "Area of shape " << i << ": " << shapes[i]->getArea() << endl; delete shapes[i]; } return 0; } ``` 以上就是一个简单的继承多态的练习题,希望能够帮助你巩固相关知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值