【笔记】C++ Primer 面向对象程序设计

【笔记】C++ Primer 面向对象程序设计

三大核心思想:

  • 数据抽象 (接口与实现分离)
  • 继承 (相似类型构造)
  • 动态绑定 (一定程度忽略类型差异)

基类与派生类

基类

  • 基类一般应该构建一个虚函数,不管是否有实际意义

  • 基类与派生类共有的成员函数,在派生类中需要覆盖(override)重新写。

    • 前提是基类的成员函数指明是虚函数(virtual)
    • C++11标准,派生类可以通过显式的指明虚成员函数重写覆盖(override)
    • 调用的时候通过动态绑定的方式,选择基类还是派生类的函数调用。
    • 所有的非构造、非静态的成员函数,可以定义为虚函数。
  • 继承后的访问控制

    • 派生类通过派生类表来实现继承,如代码1-1
    • 使用 publicprotectedprivate 三个访问修饰符,限制派生类访问基类的成员权限
// 代码 1-1
class bulk_class : public Book
{
private:
	// ...   	
public:
    // ...
}

派生类

  • 派生类通过类派生列表(class derivation list),明确指出继承于哪些(个)类。
  • 单继承与多继承。
  • 派生类可以选择是否覆盖虚函数。C++11标准通过使用override显式覆盖。
  • 派生类对象包含基类的部分。如果基类指针指向派生类对象,那么指向的位置是派生类对象的基类部分。
  • 派生类通过调用基类的构造函数来构造派生类对象的基类部分。
    • 最先初始化基类
    • 然后按照成员声明顺序初始化
  • 静态成员函数在继承的体系中是唯一的。
  • 对于要派生的基类,必须已经声明和定义
  • C++11新标准,使用 final 关键字,防止继承。

类型转换和继承

  • 派生类对象可以绑定到基类指针或者引用
  • 静态类型=编译时,动态类型=运行时。
  • 基类无法向派生类隐式转换。
  • 对象之间不存在类型转换,只出现在指针和引用。
  • 使用派生对象初始化基类对象,只会使用派生对象的基类部分

虚函数

  • 如果虚函数中使用默认参数,最后基类和派生类一致。
  • 强制使用某一个派生类版本的虚函数,可以通过作用域运算符。代码1-2
// 代码 1-2
double undiscount = base->Quote::net_price(42);

抽象基类

  • 纯虚函数 =0
  • 抽象基类一定包含纯虚函数

访问控制与继承

  • 派生类或者友元只能访问派生类的基类部分

  • 通过 using关键字,提高访问权限

  • struct 默认访问为 public | class 默认访问为 private

继承中的类作用域

  • 派生类的作用域位于基类的作用域内

  • 通过域运算符使用隐藏成员

  • 名字查找与继承

posted @ 2020-09-24 16:14  卧听惊涛骇浪  阅读(66)  评论(0)    收藏  举报