【笔记】C++ Primer 面向对象程序设计
【笔记】C++ Primer 面向对象程序设计
三大核心思想:
- 数据抽象 (接口与实现分离)
- 继承 (相似类型构造)
- 动态绑定 (一定程度忽略类型差异)
基类与派生类
基类
-
基类一般应该构建一个虚函数,不管是否有实际意义
-
基类与派生类共有的成员函数,在派生类中需要覆盖(override)重新写。
- 前提是基类的成员函数指明是虚函数(virtual)
- C++11标准,派生类可以通过显式的指明虚成员函数重写覆盖(override)
- 调用的时候通过动态绑定的方式,选择基类还是派生类的函数调用。
- 所有的非构造、非静态的成员函数,可以定义为虚函数。
-
继承后的访问控制
- 派生类通过派生类表来实现继承,如代码1-1
- 使用
public、protected、private三个访问修饰符,限制派生类访问基类的成员权限。
// 代码 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
继承中的类作用域
-
派生类的作用域位于基类的作用域内
-
通过域运算符使用隐藏成员
-
名字查找与继承
只知道方法,却忘记了努力,因小失大。

浙公网安备 33010602011771号