概念:
继承和派生
派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。派生类一经定义后,可以独立使用,不依赖于基类。
在创建派生类的对象时:
- 先执行基类的构造函数,用以初始化派生类对象中从基类继承的成员;
- 再执行成员对象类的构造函数,用以初始化派生类对象中成员对象。
- 最后执行派生类自己的构造函数
析构函数的调用顺序和构造函数相反
派生类可以定义一个和基类成员同名的成员,这叫覆盖。
在派生类中访问这类成员时,缺省的情况是访问派生类中定义的成员。要在派生类中访问由基类定义的同名成员时,要使用作用域符号::。
派生类对象的内存空间
派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。 在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员变量之前
公有继承(is-a关系):
- 派生类拥有基类的全部成员函数和成员变量,不论是private、 protected、 public 。
- 在派生类的各个成员函数中,不能访问基类中的private成员,只可以访问其公有和保护成员。
public继承的赋值兼容规则
- 派生类的对象可以赋值给基类对象 b = d;
- 派生类对象可以初始化基类引用 base & br = d;
- 派生类对象的地址可以赋值给基类指针 base * p = d;
但是即便基类指针指向的是一个派生类的对象,也不能通过基类指针访问基类没有,而派生类中有的成员。
如果派生方式是 private或protected,则上述三条不可行
私有继承、保护继承、对象成员(has-a关系):
- protected继承时,基类的public成员和protected成员成为派生类的protected成员。保护继承与私有继承仅在第三代类及以后有差别。
- private继承时,基类的public成员和protected成员成为派生类的private成员,这意味着基类方法不会成为派生类对象公有接口的一部分,但可以在派生类的成员函数中使用它们。访问基类对象本身:使用强制类型转换将(*this)转换成想访问的基类对象的类型
- 对于继承的对象,构造函数在成员初始化列表中使用类名来调用特定的基类构造函数。对于对象成员,构造函数则使用成员名。
- 通常应使用对象成员来建立 has-a 关系,但如果需要访问基类的保护成员,或需要重新定义虚函数,则应使用私有继承。
- 使用using 可以重新定义访问权限,在public中使用using声明来指出派生类可以使用的特定基类成员,即使采用的是私有派生。
直接基类与间接基类
- 在声明派生类时, 只需要列出它的直接基类
- 派生类沿着类的层次自动向上继承它的间接基类
- 派生类的成员包括
• 派生类自己定义的成员
• 直接基类中的所有成员
• 所有间接基类的全部成员
对象指针(know关系):
即类中含有其他类的对象指针或对象指针数组成员。
逻辑上比较典型的关系是户主与狗的关系:一个户主可以有多只狗,一只狗只能有一个主人,此时户主类中就应包含一个狗类对象指针数组,而狗类中应包含一个户主类对象指针。
友元类(控制关系):
语法:friend class 类名;//此声明可在类中的任何位置
友元类可以使用原来中的任何成员。
典型的逻辑关系:遥控器与电视:遥控器可以控制电视进行一些操作,而遥控器既不属于电视,又不是电视,此时就应将遥控器类声明为电视类的友元类