C++ Primer Plus第十三章复习题

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

答:

基类的公有成员成为派生类的公有成员。

基类的保护成员成为派生类的保护成员。

基类的私有成员被继承,但不能直接访问。

复习题2的答案提供了这些通用规定的特例。
 

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

答:

不能继承构造函数、析构函数、赋值运算符和友元。

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

答:

如果返回的类型为void,仍可以使用单个赋值,但不能使用连锁赋值:
baseDMA magazine ( "Pandering to Glitz",1);
baseDMA gift1,gift2,gift3;
gift1 = magazine;
gift 2 = gift3 = gift1;
如果方法返回一个对象,而不是引用,则该方法的执行速度将有所减慢,这是因为返回语句需要复制对象。

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

答:按派生的顺序调用构造函数,最早的构造函数最先调用。调用析构函数的顺序正好相反。

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

答:是的,每个类都必须有自己的构造函数。如果派生类没有添加新成员,则构造函数可以为空,但必须存在。

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

答:

只调用派生类方法。它取代基类定义。仅当派生类没有重新定义方法或使用作用域解析运算符时,才会调用基类方法。然而,应把将所有要重新定义的函数声明为虚函数。 

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

答:如果派生类构造函数使用new或new[]运算符来初始化类的指针成员,则应定义一个赋值运算符。更普遍地说,如果对于派生类成员来说,默认赋值不正确,则应定义赋值运算符。

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

答:

当然,可以将派生类对象的地址赋给基类指针;但只有通过显式类型转换,才可以将基类对象的地址赋给派生类指针(向下转换),而使用这样的指针不一定安全。

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

答:是的,可以将派生类对象赋给基类对象。对于派生类中新增的数据成员都不会传递给基类对象。然而,程序将使用基类的赋值运算符。仅当派生类定义了转换运算符(即包含将基类引用作为唯一参数的构造函数)或使用基类为参数的赋值运算符时,相反方向的赋值才是可能的。

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

答:它可以这样做,因为C++允许基类引用指向从该基类派生而来的任何类型。

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

答:按值传递对象将调用复制构造函数。由于形参是基类对象,因此将调用基类的复制构造函数。复制构造函数以基类引用为参数,该引用可以指向作为参数传递的派生对象。最终结果是,将生成一个新的基类对象,其成员对应于派生对象的基类部分。

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

答:按引用(而不是按值)传递对象,这样可以确保函数从虚函数受益。另外,按引用(而不是按值)传递对象可以节省内存和时间,尤其对于大型对象。按值传递对象的主要优点在于可以保护原始数据,但可以通过将引用作为const类型传递,来达到同样的目的。

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

1)常规非虚方法

2)虚方法;

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

答:如果head()是一个常规方法,则ph->head( )将调用Corporation::head( );如果head( )是一个虚函数,则ph->head()将调用PublicCorporation::head()。
 

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

class Kitchen
{
private:
    double kit_sq_ft;
public:
    Kitchen(){kit_sq_ft = 0.0;}
    virtual double area() const { return kit_sq_ft * kit_sq_ft;}
};
class House : public Kitchen
{
private:
    double all_sq_ft;
public:
    House(){all_sq_ft += kit_sq_ft;}
    double area(const char *s) const{ cout << s; return all_sq_ft;}
};

答:

首先,这种情况不符合 is-a模型,因此公有继承不适用。

其次,House中的area()定义隐藏了area()的Kitchen版本,因为这两个方法的特征标不同。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值