科锐课堂笔记:2017/4/21 多重继承与智能指针

来源:互联网 发布:清除localstorage数据 编辑:程序博客网 时间:2024/06/06 11:17

  一个派生类可以继承自多个基类,称作多重继承。派生类内部继承的基类成员不仅和声明顺序还与基类本身有无虚函数表有关,有虚表的在前没虚表的在后,两组内部再按声明顺序,依次将成员(包括虚表)继承给派生类。派生类构造前会覆盖各个基类的虚表,编译器也很聪明的在派生类虚析构函数末尾生成分别调用各个基类虚析构(按逆顺)的代码。
  如果多重继承的父类又继承自同一个祖父类,这种菱形继承的结构使得多个父类内部都独立存在祖父类的成员,当子类直接引用祖父类成员时就会引发歧义,编译器不知道该引用哪个继承自祖父类的父类,虽然可以显式写明类域消除二义性,但父类中的数据重复了,占用了内存空间。想要这些父类共享同一个祖父类成员数据,必须在父类继承祖父类时指明虚继承(virtual),此时在菱形继承的子类中,父类数据在前(按照上述规则排序),子类数据在父类之后,最末尾跟着的才是祖父类数据。所谓共享肯定离不开指针,所以在每个父类的数据成员前、虚表指针后放了一个结构指针,此结构偏移4处是一个4字节偏移量(从结构指针地址起),指向祖父类对象的基址。


  智能指针本身是一个对象,可它的使用方法看上去和普通指针一样,通过重载对象的取地址(&)、解引用(*)、赋值(=)、成员运算符(->)和类型转换运算符模拟完成指针的常规操作。因为类有析构,在析构函数中释放拥有的对象,比起普通指针手动调用,智能指针不用担心调用不配对造成内存泄露的问题。还可在智能指针中使用引用计数,避免多次释放的情况。


  模板:
  C++支持模板,像上面的智能指针类使用了模板就变成一个通用的智能指针类,能适应各类指针,不必再一一定义每一种类型的智能指针。模板分为函数模板和类模板。
  函数模板语法:
  template <typename T> T 函数名(T 参数,…)
  template是模板关键字,方括号typename T表示一个类型引用,也可以声明多个类型,方括号内如果定义基本数据类型(外部只能传入常量),其符号在函数内部像变量一样直接访问。typename的类型符号随定义的变化而变化,称作泛型编程。函数模板有隐式实例化与显式实例化,编译器会根据传入的参数类型在背后默默定义一个模板函数,这是隐式的。我们也可以调用函数时在方括号里指明类型(可以只写一部分),显式实例化一个模板函数。
  函数模板还支持特例化,显式定义某一类型的模板函数(与函数模板写法类似,只是去掉方括号里内容,因为不需要了),此后无论隐式或显式调用该类型模板函数,执行的是被类型特例化的函数。


  模板类语法:
  template <typename T> class 类名
  template <typename T> T 类名<T>::成员函数(T 参数,…)
  模板类总体上和模板函数差不多,也有成员函数特例化,传基本类型常量,除了模板类必须显式实例化和可以定义默认类型(从右起)。

0 0
原创粉丝点击