C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承相关的知识,希望对你有一定的参考价值。

1. 继承体系中的每个类都可能在某个时刻成为“ 最低层的派生类”。 只要我们能创建虚基类的派生类对象, 该派生类的构造函数就必须初始化它的虚基类。

Bear::Bear (std::string name, bool onExhibit):
   ZooAnimal (name, onExhibit, "Bear”)  
Raccoon::Raccoon (std::string name, bool onExhibit )
   ZooAnimal (name, onExhibit, "Raccoon”)  

1.1 虚继承的对象的构造方式

含有虚基类的对象的构造顺序与一般的顺序稍有区别:
step1.使用提供给最低层派生类构造函数的初始值初始化该对象的虚基类子部分
step2.按照直接基类在派生列表中出现的次序依次对其进行初始化

eg. 当创建一个 Panda 对象时, Panda 位于派生的最低层并由它负责初始化共享的ZooAnimal 基类部分。 即使 ZooAnimal 不是 Panda 的直接基类, Panda 的构造函数也可以初始化 ZooAnimal:
step1. 使用 Panda 的构造函数初始值列表中提供的初始值构造虚基类 ZooAnimal
部分。
step2. 构造 Bear 部分。
step3.构造Raccoon 部分。
step4.构造第三个直接基类 Endangered。
step5.构造 Panda 部分

Panda::Panda (std::string name, bool onExhibit )
           : ZooAnimal (name, onExhibit, "Panda"),
             Bear (name, onExhibit ),
             Raccoon (name, onExhibit ) ,
             Endangered (Endangered::critical),
             sleeping_flag ( false)  

1.2 构造函数与析构函数的次序

一个类可以有多个虚基类。 此时, 这些虚的子对象按照它们在派生列表中出现的顺序从左向右依次构造。

class Character  /* ... */ ;
class BookCharacter : public Character  /* …*/ ;
class ToyAnimal  /* ... */;
class TeddyBear : public BookCharacter,
public Bear, public virtual ToyAnimal
  /* ... */ ;

编译器按照直接基类的声明顺序对其依次进行检査, 以确定其中是否含有虚基类。 如果有, 则先构造虚基类, 然后按照声明的顺序逐一构造其他非虚基类。 因此, 要想创建一个 TeddyBear 对象, 需要按照如下次序调用这些构造函数:

ZooAnimal ( );/ / Bear 的虚基类
ToyAnimal ( );/ / 直接虚基类
Character ( );/ / 第一个非虚基类的间接基类
BookCharacter ( )/ / 第一个直接非虚基类
Bear ( );/ / 第二个直接非虚基类
TeddyBear ( ) ;/ / 最低层的派生类

1.3 合成的拷贝和移动构造函数按照完全相同的顺序执行, 合成的赋值运算符中的成员也按照该顺序赋值。

1.4 对象的销毁顺序与构造顺序正好相反, 首先销毁TeddyBear 部分, 最后销毁 ZooAnimal 部分

以上是关于C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 18 大型程序工具)noexcept

C++ Primer 5th笔记(chap 18 大型程序工具)异常处理

C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常

C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性

C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间

C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承