C++primer15章总结

1.  继承和动态绑定在两个方面简化了我们的程序:能够容易的定义与其他类相似但又不相同的新类,能够更容易的编写忽略这些相似类型之间区别的程序

2.  在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。

3.  继承层次的根类一般都要定义虚析构函数。

4.  除了构造函数外,任意非static成员函数都可以是虚函数。保留字virtual只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。

5.  尽管不是必须这样做,派生类一般会重定义所继承的虚函数。如果派生类没有重定义某个虚函数,则使用基类中定义的版本。

6.  派生类中虚函数的声明必须与基类中的定义方式完全匹配,但有一个例外:返回对基类型的引用(或指针)的虚函数。派生类中的虚函数可以返回基类函数所返回类型的派生类的引用(或指针)。

7.  一旦函数在基类中声明为虚函数,它就一直为虚函数,派生类无法改变该函数为虚函数这一事实。派生类重定义虚函数时,可以使用virtual保留字,但不是必须这样做。

8.  C++语言不要求编译器将对象的基类部分和派生部分连续排列。

9.  已定义的类才可以用作基类。这一规则暗示着不可能从类自身派生出一个类。

10. 派生类用struct定义时默认为public继承,用class定义时默认为private继承

11. 声明一个派生类不需要包含派生列表。

12. 无论实际对象具有哪种类型,编译器都将它当做基类类型对象。将派生类对象当做基类对象是安全的。

13. 基类类型引用和指针的关键点在于:静态类型static type, 在编译时可知的引用类型或指针类型) 和动态类型dynamic type,指针或引用所绑定的对象的类型,这是仅在运行时可知的)可能不同。

14. (再废话一遍,毕竟多态是C++的核心) 将基类类型的引用或指针绑定到派生类对象对基对象没有影响,对象本身不会改变,仍为派生类对象。对象的实际类型可能不同于该对象引用或指针的静态类型,这是C++动态绑定的关键(引用和指针的静态类型与动态类型可以不同,这是C++用以支持多态性的基石)

15. 如果调用非虚函数,那直接调用基类的,编译时就可以知道。如果调用虚函数,则编译时不知道必须到运行时才能确定。

16. 用作用域操作符强制覆盖虚函数机制baseP->Item_base::net_price(42);

17. 只有成员函数中的代码才应该使用作用与操作符覆盖虚函数机制。最佳实践

18. 如果有用在给定调用中的默认实参值该值将在编译时确定。如果一个调用省略了具有默认值的实参,则所用的值由调用该函数的类型定义,与对象的动态类型无关

19. 在同一虚函数的基类版本和派生类版本中使用不同的默认实参几乎一定会引起麻烦。如果通过基类的引用或指针调用虚函数,但实际执行的是派生类中定义的版本。这时就可能会出现问题:为虚函数的基类版本定义的默认实参将传给派生类定义的版本,而派生类版本是用不同的默认实参定义的。

20. 设计良好的类层次中,public派生类对象可以用在任何需要基类对象的地方。

21. classstruct唯一的不同只是默认的成员保护级别和默认的派生保护级别,没有其他区别。

22. 尽管私有继承在使用class保留字时是默认情况,但这在实践中相对罕见。因为私有继承是如此罕见,通常显示指定private是比依赖于默认更好的办法。显示指定可清楚指出想要私有继承而不是一时疏忽。

23. 友元关系不能继承。

24. 如果基类和派生类都需要访问另一个类,那个类必须特地将访问权限授予基类和每一个派生类。

25. static在整个继承层次中都只有一个这样的成员。无论从基类派生出多少个派生类,每个static成员只有一个实例。

26. 一个是将派生类对象转换为基类类型引用,一个是用派生类对象对基类对象进行初始化或赋值,理解他们之间的区别很重要。

27. 更令人惊讶的是,甚至当基类指针或引用实际绑定到派生类对象时,从基类到派生类的转换也存在限制。 因为编译器确定转换是否合法,只看指针或引用的静态类型。在这些情况下,如果知道从基类到派生类的转换是安全的,就可以使用static_cast强制编译器进行转换。或者,可以使用dynamic_cast申请在运行时进行检查。(这两个东西还不知道是什么。。后边才介绍)

28. 哎!看到现在!有点累啊!! 看的这些东西都是其实还是知道大半的但是不扎实现在再看一遍没想到都看这么慢本来以为这个月(哦现在是2013年11月28日0:36:37)可以看完的,结果还有200页。。  哎! 继续看!

29. 构造函数和复制控制成员不能继承。

30. 继承对基类的构造函数的唯一影响是:在确定提供哪些构造函数时,必须考虑一类新用户。像任意其他成员一样。某些类需要只希望派生类使用的特殊构造函数,这样的构造函数应定义为protected

31. 派生类的合成构造函数自动调用基类的默认构造函数。基类部分由基类的默认构造函数完成。

32. 自定义的默认构造函数不主动调用基类构造函数的话也会自动调用基类的默认构造函数。

33. 只能初始化直接基类。(这个被叫做尊重基类接口。。。)

34. 尊重基类接口具体说:派生构造函数可以在构造函数函数体中给基类publicprotected成员赋值,但是这样做会违反基类的接口。派生类应该通过使用基类构造函数尊重基类的初始化意图,而不是在派生类构造函数函数体中对这些成员赋值。

35.  类是否需要定义复制控制成员完全取决于类自身的直接成员。基类可以定义自己的复制控制而派生类使用合成版本,反之亦然。 如果派生类定义了自己的复制构造函数,该复制构造函数一般应显示使用基类复制构造函数初始化对象的基类部分。

36. 如果派生类定义了自己的赋值操作符,则该操作必须对基类部分进行显示赋值。赋值操作符必须防止自身赋值,因为在使用基类部分的赋值时,基类操作符将释放左操作数中基类部分的值,并赋以来自rhs的新值。(但这里自己写程序发现不是这样的。。。)

37. 派生类析构函数不负责撤销基类对象的成员。编译器总是显示调用派生类对象基类部分的析构函数。每个析构函数只负责清除自己的成员。

38. 如果删除基类指针,则需要运行基类析构函数并清除基类的成员,如果对象实际是派生类型的,则没有定义该行为。要保证运行适当的析构函数,基类中的析构函数必须为虚函数。基类几乎总是需要析构函数,从而可以将析构函数设为虚函数。

39. 构造函数不能定义为虚函数,构造函数是在对象完全构造之前运行的,在构造函数运行的时候,对象的动态类型还不完整。

40. 将赋值操作符设为虚函数可能会令人混淆,因为虚函数必须在基类和派生类中具有同样的形参。   将类的赋值操作符设为虚函数很可能会令人混淆,而且不会有什么用处。

41. 如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本: 考虑如果从基类构造函数调用虚函数的派生类版本会怎么样。

42. 与基类成员同名的派生类成员将屏蔽对基类成员的直接访问。

43. 在基类和派生类中使用同一名字的成员函数,即使函数原型不同,基类成员也会被屏蔽。因为编译器在找函数的时候先按照名字找,一旦找到就不继续查找了

44. 回忆一下,局部作用域中声明的函数不会重载全局作用域中定义的函数。同样,派生类中定义的函数也不重载基类中定义的成员。

45. 理解C++中继承层次的关键在于理解如何确定函数调用。确定函数调用遵循以下四个步骤:

①  首先确定进行函数调用的对象,引用或指针的静态类型

②  在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关基类中找到该名字,则调用是错误的。

③  一旦找到了该名字,就进行常规类型检查,查看如果给定找到的定义,该函数调用是否合法。

④  假定函数调用合法,编译器就生成代码,如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本否则,编译器生成代码直接调用函数。

46. 含有(或继承)一个或多个纯虚函数的类是抽象基类。除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象

47. typedef bool (*Comp)(constSales_item&, const Sales_item&);

这个语句将Comp定义为函数类型指针的同义词

48. std::multiset<Sales_item,Comp> items(compare);

49. 理解设计经常是最困难的部分,尤其是刚开始设计面向对象系统时。 一旦熟悉了设计,实现就是是顺理成章的了。

50. 这里存在一个问题:只有成员函数可以为虚函数,但输出操作符不能是Query_base类的成员。

51. 有一种情况下,必须总是使用完全限定的标准库名字在头文件中。理由是头文件的内容会被预处理器复制到程序中。用#include包含文件时,相当于头文件中的文本将成为我们编写的文件的一部分。如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一个using声明,不论程序是否需要using声明。通常,头文件中应该只定义确实必要的东西。请养成这个好习惯

52. 虚析构函数为protected。析构函数由派生类析构函数(隐式)使用,因此派生类必须能够访问析构函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值