有人可以帮助我使用虚拟函数时的破坏顺序吗?是从基类开始,然后是派生类吗?
由于我没有看到虚函数如何改变任何对象的销毁顺序,我假设您指的是虚函数中基类和数据成员的销毁顺序遗产设想。
子对象是建
-
基类被建造从最基础到最衍生;
-
多个基类均建于声明为基类的顺序;
-
虚拟基类被建造在所有其他人之前,彼此之间遵守上述两条规则;
-
数据成员被建造在执行封闭对象的构造函数主体之前,按照声明的顺序。
毁灭正好相反建造,所以你只需要记住上面的内容即可。
然而,上述四个规则是按这个顺序排列的,因为这是有道理的,如果你理解为什么这个顺序有意义,你甚至不必记住这四个规则,而是可以从你的理解中推断出它们(就像我刚才所做的那样)。那么让我们检查一下这个顺序:
- 您可能想要使用基类从派生类的构造函数提供的任何服务。当然,在实际构造之前您不能使用(基)类对象。因此,当构造派生类时,需要已经构造基类。 (顺便说一句,这也解释了为什么虚函数分派不能在构造函数中完全工作:当构造子对象时,只有基类的子对象已经构造完毕;派生类的子对象还没有构造构造函数。因此,不得将对虚函数的调用分派给派生类。与往常一样,析构函数是相同的,只是向后。)
- 由于多个基类是平等的兄弟姐妹,因此必须任意选择某些顺序。最终,声明的顺序是最简单的使用顺序。数据成员也是平等的兄弟,遵循相同的(或多或少任意的)声明顺序规则。
- 虚拟基类是奇怪的野兽。因为虚拟基类总是只有一个子对象,所以有一条特殊的规则,它总是需要首先从最派生类的构造函数构造。 (这就是为什么虚拟基类作为没有数据且只有默认构造函数的抽象基类效果最好。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)