继承:
可以理解为一个类从另一个类中获取成员变量和成员函数的过程. eg:B类继承于 A类, 那么B 就拥有 A 的成员变量和成员函数. 被继承的类称为父类或者基类, 继承的类称为子类或者派生类.
派生类除了拥有基类的成员, 还可以定义自己的成员函数和成员变量.
class 派生类名: [继承方式] 基类名 {
派生类的新成员;
};
// 继承承方式限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选的,如果不写,默认为 private 或 protected。
(1) public 继承方式
- 基类中所有public 成员在派生类中的属性为 public;
- 基类中所有 protected 成员在派生类中的属性为 protected;
- 基类中所有 private 成员在派生类中是不可访问的.
(2) protected 继承方式
- 基类中所有的 public 成员在派生类中为 protected 属性;
- 基类中所有的 protected 成员在派生类中为protected 属性;
- 基类中所有的 private 成员在派生类中是不可访问的.
(3) private 继承方式
- 基类中所有的 public 成员在派生类中都为 private 属性;
- 基类中所有的 protected 成员在派生类中都为 private 属性;
- 基类中所有的 private 成员在派生类中都是不可访问的.
基类的构造函数不能被派生类继承, 在声明派生类时, 对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成. 所以在设计派生类的构造函数时, 不仅要考虑派生类新增的成员变量, 还要考虑基类的成员变量, 要让他们都被初始化.
解决这个问题的思路是:在执行派生类的构造函数时, 调用基类的构造函数.
事实上, 通过派生类创建对象时, 必须调用基类的构造函数.
当创建对象时, 会先调用基类的构造函数, 再调用派生类的构造函数.(自基类向派生类)
析构函数是不能被继承的.
析构函数的调用时与构造函数的调用顺序相反, 先调用派生类的析构函数, 再调用基类的析构函数.
多继承:
http://c.biancheng.net/cpp/biancheng/view/2986.html
这个例子很好的说明了:基类对象和派生类对象之间的赋值仅仅是对应的成员变量的赋值,不会影响成员函数,不会影响 this 指针。
virtual:
借助虚函数, 基类指针既可以调用基类的成员函数, 也可以使用派生类的成员函数, 它有多种形态, 或多种表现方式, 这就是多态.
多态是面向对象的主要特征, 在 c++中, 虚函数的唯一作用就是构成多态.
C++提供多态的目的是: 可以通过基类指针对所有派生类(包括直接派生类和简介派生类) 的成员变量和成员函数进行"全方位"的访问, 尤其是成员函数. 如果没有多态, 我们只能访问成员变量.
构成多态的条件:
- 必须存在继承关系;
- 继承关系中必须有同名的虚函数, 并且它们是覆盖关系 (重载不行).
- 存在基类的指针, 通过改制这调用虚函数.
Note:
- 派生类中的虚函数必须覆盖(不是重载)基类的虚函数, 才能通过基类指针访问.
有虚函数才能构成多态,
另外注意:
- virtual 关键字仅用于函数声明, 如果函数是在类外定义, 则不需要再加上 virtual 关键字.
- 为了方便, 你可以只将基类中的函数声明为虚函数, 所有派生类中具有覆盖关系的同名函数都将自动成为虚函数.