2021-03-17 C++ Primer Plus 第十三章 类继承 复习题

复习题

1.派生类从基类那里继承了什么?

基类的公有成员将成为派生类的公有成员,基类的私有对象也将成为派生类的一部分,但只能通过基类的公有和保护方法访问。

2.派生类不能从基类那里继承什么?

  • 构造函数
  • 赋值运算符
  • 析构函数
  • 友元

3.假设 baseDMA ::operation=()函数的返回类型为void,而不是 baseDMA &,这将有什么后果?如果返回类型为baseDMA,而不是 baseDMA &,又将有什么后果?

  1. 该重载运算符只能用于单独赋值,而不能连续赋值。
  2. 赋值运算符会返回一个baseDMA定义的对象,并将=右侧的值赋给左侧,占用了更多时间和内存。

4.创建和删除派生类对象时,构造函数和析构函数调用的顺序是怎样的?

  • 创建派生类对象时,先调用基类的构造函数(负责初始化继承的数据成员),再调用派生类的构造函数(初始化新增的数据成员)
  • 先调用派生类的析构函数,再调用基类的构造函数

5.如果派生类没有添加任何数据成员,它是否需要构造函数?

需要构造函数

6.如果基类和派生类定义了同名的方法,当派生类对象调用该方法时,被调用的将是哪个方法?

调用派生类定义的方法。如果希望派生类重新定义方法,则应在基类中将方法定义为虚方法。

7.在什么情况下,派生类应定义赋值运算符?

如果派生类的构造函数使用了动态内存分配,则必须提供给显式赋值运算符。

8.可以将派生类对象的指针赋给基类指针吗?可以将基类对象的地址赋给派生类指针吗?

  • 能(向上强制转换)
  • 能 (向下强制转换,必须要显式类型转换)

9.可以将派生类对象赋给基类对象吗?可以将基类对象赋给派生类对象吗?

  • 能,派生类新增的数据成员将被丢弃
  • 也许能,仅当如果派生类定义了用于将基类对象给派生对象的赋值运算符

10.假设定义了一个函数,它将基类对象的引用作为参数。为什么该函数也可以将派生类对象作为参数?

因为根据向上强制转换原则,基类对象的引用或指针也可以指向派生类。

11.假设定义了一个函数,它将基类对象作为参数(即函数按值传递基类对象)。为什么该函数也可以将派生类对象作为参数?

将基类对象作为函数参数,按值传递将会把派生类的基类部分传递给函数。因此该函数也可以将派生类对象作为参数。

12.为什么通常按引用传递对象比按值传递对象的效率更高?

  • 通过传递引用而不是整个数据对象,可以提高程序的运行速度
  • 利用关键字const传递引用也可以保护原始数据
  • 如果使用了虚函数,则程序将根据引用指向的对象的类型来选择方法

13.假设Corporation是基类,PublicCorporation是派生类。再假设这两个类都定义了head()函数,ph是指向Corporation类型的指针,且被赋给了一个PublicCorporation对象的地址。如果基类将head()定义为:

a.常规非虚方法;

b.虚方法;

则ph->head()将被如何解释?

a.调用Corporation的head()方法

b.调用PublicCorporation的head()方法

14.下述代码有什么问题?

  • 不符合is-a继承模型,House和kitchen派生和基关系反转了

  • 派生类中调用了基类私有域中的变量 kit_sq_ft

  • 重载了基类定义的虚方法

你可能感兴趣的:(2021-03-17 C++ Primer Plus 第十三章 类继承 复习题)