第十五章 面向对象程序设计

  1. 面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。
  2. C++11 标准允许派生类显示地注明它将使用哪个成员函数改写基类的虚函数,具体措施是在该函数的形参列表之后增加一个 override 关键字。
  3. 在C++语言中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定。
  4. 基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。
  5. 任何构造函数以外的非静态函数都可以是虚函数。关键字 virtual 只能出现在类内部的生命语句之前而不能用于类外部的函数定义。如果基类把一个函数声明成虚函数,则该函数在派生类中隐式地也是虚函数。
  6. 成员函数如果没有被声明成虚函数,则其解析过程发生在编译时而非运行时。
  7. 如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。
  8. C++11 新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字 final 。
  9. 理解基类和派生类之间的类型转换是理解C++语言面向对象编程的关键所在。
  10. 当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分会被拷贝、移动或赋值,它的派生类部分将被忽略掉。
  11. 要理解在具有继承关系的类之间发生的类型转换,有三点非常重要:
        ① 从派生类向基类的类型转换只对指针或引用类型有效;
        ② 基类向派生类不存在隐式类型转换;
        ③ 和任何其他成员一样,派生类向基类的类型转换也可能会由于访问受限而变得不可行。
        (尽管自动类型转换只对指针或引用类型有效,但是继承体系中的大多数类仍然(显示或隐式地)定义了拷贝控制成员。因此,我们通常能够将一个派    生类对象拷贝、移动或赋值给一个基类对象)
  12. 动态绑定只有当我们通过指针或引用调用虚函数时才会发生。
  13. 基类中的虚函数在派生类中隐含地也是一个虚函数。当派生类覆盖了某个虚函数时,该函数在基类中的形参必须与派生类中的形参严格匹配。
  14. 如果某次函数调用使用了默认实参,则该实参值由本次调用的静态类型决定。(如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致。)
  15. 如果我们希望对虚函数的调用不要进行动态绑定,而是强迫其执行虚函数的某个特定版本。使用作用于运算符可以实现这一目的。通常情况下,只有成员函数(或友元)中的代码需要使用作用域运算符来回避虚函数的机制。
  16. 含有(或者未经覆盖直接继承)纯虚函数的类时抽象基类(abstract base class)。我们不能创建抽象基类的对象。
  17. 派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。
  18. 派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限。、
  19. 对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的;反之则不行。
  20. 不能继承友元关系;每个类负责控制各自成员的访问权限。
  21. 派生类只能为那些它可以访问的名字提供 using 声明。
  22. 人们常常有一种错觉,认为在使用 struct 关键字和 class 关键字定义的类之间还有更深层次的差别。事实上,唯一的差别就是默认成员访问说明符及默认派生访问说明符;除此之外,再无其他不同之处。
  23. 一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。
  24. 派生类的成员将隐藏同名的基类成员。我们可以通过作用于运算符来使用一个被隐藏的基类成员。(除了覆盖继承而来的虚函数之外,派生类最好不要重用其他定义在基类中的名字。)
  25. 和其他作用域一样,如果派生类(即内层作用域)的成员与基类(即外层作用域)的某个成员同名,则派生类将在其作用域内隐藏该基类的成员。即使派生类成员和基类成员的形参列表不一样,基类成员也仍然会被隐藏掉。
  26. 如果基类的析构函数不是虚函数,则 delete 一个指向派生类的基类指针将产生未定义的行为。(动态绑定析构函数)
  27. 如果一个类定义了析构函数,即使它通过 =default 的形式使用了合成的版本,编译器也不会为这个类合成移动操作。
  28. 当派生类定义了拷贝或移动操作时,该操作负责拷贝或移动包括基类部分成员在内的整个对象。
  29. 在默认情况下,基类默认构造函数初始化派生类对象的基类部分。如果我们想拷贝(或移动)基类部分,则必须在派生类的构造函数初始值列表中显示地使用基类的拷贝(或移动)构造函数。
  30. 与拷贝和移动构造函数一样,派生类的赋值运算符也必须显示地为其基类部分赋值。
  31. 如果构造函数或析构函数调用了某个虚函数,则我们应该执行与构造函数或析构函数所属类型相对应的虚函数版本。
  32. 如果基类含有几个构造函数,则除了两个例外情况,大多数时候派生类会继承所有这些构造函数:
        ① 如果派生类定义的构造函数与基类的构造函数具有相同的参数列表,则该构造函数将不会被继承。
        ② 默认、拷贝和移动构造函数不会被继承。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值