C++ Primer 笔记17

1、多重继承
C++ <wbr>Primer <wbr>笔记17
class Panda : public Bear, public Endangered{
...
};
基类构造函数按照基类在类派生列表中的出现次序调用。对Panda而言,基类初始化的次序是:
① ZooAnimal,从Panda的直接基类Bear沿层次向上的最终基类。
② Bear,第一个直接基类
③ Endangered,第二个直接基类,它本身没有基类
④ Panda,初始化Panda本身的成员,然后运行它的构造函数的函数体
    构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响。
2、对于多重继承,派生类的指针或引用可以转换为其任意基类的指针或引用。像单继承一样,用基类的指针或引用只能访问基类中定义(或继承)的成员,不能访问派生类中引入的成员。
    假定所有根基类都将他们的析构函数适当定义为虚函数,那么,无论通过哪种指针类型删除对象,析构函数的处理都是一致的。
3、 虚继承(virtual inheritance) 是一种机制,类通过虚继承指出它希望共享其虚基类的状态。在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。 共享的基类子对象称为虚基类(virtual base class)。
4、
C++ <wbr>Primer <wbr>笔记17
通过关键字virtual修改声明,将基类指定为通过虚继承派生。例:
class Raccoon : public virtual ZooAnimal{...}
class Bear : virtual public ZooAnimal{...}
class Panda : public Bear, public Raccoon, public Endangered{...}
      指定虚派生只影响从指定了虚基类的类派生的类。除了影响派生类自己的对象之外,它也是关于派生类与自己的未来派生类的关系的一个陈述。
      任何可被指定为基类的类也可以被指定为虚基类,虚基类可以包含通常由非虚基类支持的任意类元素。  即使基类是虚基类,也照常可以通过基类类型的指针或引用操纵派生类的对象。
      使用虚基类的多重继承层次比没有虚继承的引起更少的二义性问题。
5、通常,每个类只初始化自己的直接基类。在应用于虚基类的时候,这个初始化策略会失败。如果使用常规规则,就可能会多次初始化虚基类。
    为了解决这个重复初始化问题,从具有虚基类的类继承的类对初始化进行特殊处理。 在派生中,由最低层派生类的构造函数初始化虚基类。只要可以创建虚基类派生类类型的独立对象,该类就必须初始化自己的虚基类,这些初始化式只在创建中间类型的对象时使用。
6、
Panda::Panda(string name, bool onExhibit) : ZooAnimal(name, onExhibit, "Panda"), Bear(name, Exhibit), Raccoon(name, onExhibit), Endangered(Endangered::cirtical),sleeping_flag(false){}
当创建Panda对象的时候:
① 首先使用构造函数初始化列表中指定的初始化式构造ZooAnimal部分
② 接下来,构造Bear部分。忽略Bear的用于ZoolAnimal构造函数初始化列表的初始化式
③ 然后,构造Raccoon部分,再次忽略ZooAnimal初始化式
④ 最后,构造Panda部分。
      如果Panda构造函数不显式初始化ZooAnimal基类,就使用ZooAnimal默认构造函数,如果ZooAnimal没有默认构造函数,则代码出错。
7、 无论虚基类出现在继承层次中任何地方,总是在构造非虚基类之前构造虚基类。 C++ <wbr>Primer <wbr>笔记17
      按声明次序检查直接基类,确定是否存在虚基类。例中,首先检查BookCharacter的继承子树,然后检查Bear的继承子树,最后检查ToyAnimal的继承子树。按从根类开始向下到最低层派生类的次序检查每个子树。
      TeddyBear的虚基类的构造次序是先ZooAnimal再ToyAnimal。一旦构造了虚基类,就按声明次序调用非虚基类的构造函数:首先是BookCharacter,它导致调用Character构造函数,然后是Bear。因此,为了创建TeddyBear对象,按下面次序调用次序调用构造函数:
① ZooAnimal()
② ToyAnimal()
③ Character()
④ BookCharacter()
⑤ Bear()
⑥ TeddyBear()
      在合成复制构造函数中使用同样地构造次序,在合成赋值操作符中也是按这个次序给基类赋值。保证调用基类析构函数的次序与构造函数的调用次序相反。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值