复习题
1.派生类从基类那里继承了什么?
基类的公有成员将成为派生类的公有成员,基类的私有对象也将成为派生类的一部分,但只能通过基类的公有和保护方法访问。
2.派生类不能从基类那里继承什么?
- 构造函数
- 赋值运算符
- 析构函数
- 友元
3.假设 baseDMA ::operation=()函数的返回类型为void,而不是 baseDMA &,这将有什么后果?如果返回类型为baseDMA,而不是 baseDMA &,又将有什么后果?
- 该重载运算符只能用于单独赋值,而不能连续赋值。
- 赋值运算符会返回一个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
重载了基类定义的虚方法