1 所有virtual base class constructor必须被调用,从左到右,从最深到最浅:
- 如果class 被列于member initialization list中,那么如果有任何明确指定的参数,都应该传递过去,若没有列于list中,而class有一个default constructor,也应该调用之
- 此外,class中的每一个virtual base class subobject 的偏移量(offset)必须在执行期可被存取
- 如果class object是最底层(most-derived)的class,其constructor可能被调用;某些用以支持这个行为的机制必须被放进来
2 所有上一层的base class constructor必须被调用,以base class声明的顺序为序
- 如果base class 被列于member initialization list中,那么任何明确指定的参数都应该传递过去
- 如果base class 没有被列于member initialization list中,而它有default constructor(或有default memberwise copy constructor),那么就调用之
- 如果base class 是多重继承体系下的第二或者后继的base class,那么this指针必须有所调整
3 如果class object有virtual table pointer(s),这些pointer(s)必须被设定初值,指向适当的virtual table(s)
4 记录在member initialization list中的data member初始化操作会被放进constructor中,并以members的声明顺序为顺序
5 如果有一个member没有出现在member initialization list中,但是它有一个default constructor,那么该default constructor被调用
解构的顺序与构造顺序相反!
以下是一个验证的例子
#include <iostream>
using namespace std;
class Base{
public:
Base(){cout<<"Base ctor"<<endl;}
~Base(){cout<<"Base dtor"<<endl;}
};
class B
{
public:
B(){cout<<"B ctor"<<endl;}
~B(){cout<<"B dtor"<<endl;}
};
class C:public virtual Base
{
public:
C(){cout<<"C ctor"<<endl;}
~C(){cout<<"C dtor"<<endl;}
};
class A{
public:
A(){cout<<"A ctor"<<endl;}
~A(){cout<<"A dtor"<<endl;}
};
class X{
public:
X(){cout<<"X ctor"<<endl;}
~X(){cout<<"X dtor"<<endl;}
};
class D:public A, public C,public virtual B
{
public:
D(){cout<<"D ctor"<<endl<<endl;}
~D(){cout<<"D dtor"<<endl;}
virtual void fun(){}
X x;
};
void main(){
D d;
}
VC6的输出结果如下:
Base ctor
B ctor
A ctor
C ctor
X ctor
D ctor
D dtor
X dtor
C dtor
A dtor
B dtor
Base dtor
分享到:
相关推荐
5.2 继承体系下的对象构造 虚拟继承(Virtual Inheritance) 初始化语意学(The Semantics of the vptr Initialization) 5.3 对象复制语意学(Object Copy Semantics) 5.4 对象的功能(Object Efficiency) 5.5 ...
《Inside the C++ Object Model》是一本深入探讨C++对象模型的权威著作,由Stanley B. Lippman撰写,是C++程序员深入了解语言底层机制的必读经典。这本书主要涵盖了C++对象模型的各个方面,包括内存管理、类型系统、...
5.2 继承体系下的对象构造 虚拟继承(Virtual Inheritance) 初始化语意学(The Semantics of the vptr Initialization) 5.3 对象复制语意学(Object Copy Semantics) 5.4 对象的功能(Object Efficiency) 5.5 ...
本书致力于深入解析C++编译器在处理C++代码时所采取的复杂对象模型及其背后的底层机制,特别是针对构造函数、解构函数、虚函数、继承、多态等面向对象特性的工作原理。通过对这些内容的深入讲解,读者将能够掌握C++...
在"服装设计——解构主义与插画在服装设计中的应用.docx"文档中,可能详细介绍了如何将解构主义和插画这两种元素融入到服装设计的过程。内容可能包括以下几个方面: 1. 解构主义的历史背景和发展:简述解构主义的...
10. **C++11/14/17/20新特性**:每个C++标准版本都引入了许多新特性,如类型推断(auto)、初始化列表、统一的构造/解构、并发编程支持等。熟悉这些新特性,可以使你的C++编程技能与时俱进。 以上只是C++高级编程中的...
C++作为一种支持面向对象编程的语言,其对象模型涉及构造函数、解构函数、虚函数、继承、多态等一系列复杂的概念。这些概念在C++编译器内部的处理方式和对程序执行的影响,是许多程序员希望能够深入了解的内容。侯捷...
在Python编程语言中,构造函数和解构函数是两个非常重要的概念。构造函数是一种特殊的方法,它在创建对象时自动被调用,用来初始化对象的属性。而解构函数则是在对象被删除前调用的特殊方法,用于执行一些清理工作。...
在现代C++编程中,`tuple`是一种强大的数据结构,它可以容纳不同类型的数据,并提供了一种紧凑的方式来存储和操作异构数据集。`tuple`的概念源自数学中的元组,它允许我们在一个单一的实体中组合不同类型的值。在C++...
### 服装设计——解构主义与插画在服装设计中的应用 #### 解构主义的定义与在服装设计中的应用 解构主义作为一种重要的后现代主义思潮,它反对传统意义上的秩序与规则,主张打破固有的结构框架,追求无限的可能性...
商道纵横&SAP:2022中国企业零碳战略——解构实现“双碳”目标之路(英文)
商道纵横&SAP:2022中国企业零碳战略——解构实现“双碳”目标之路(中文)
在"服装设计——解构主义与插画在服装设计中的应用.docx"文档中,很可能会详细探讨这两种理念如何相互融合,提供实例分析,甚至包括具体的步骤和技巧,指导设计师如何在自己的作品中运用解构主义和插画,提升设计的...
`Object.assign()`方法用于合并多个对象到一个目标对象,但并不涉及原型链的继承。以下例子展示了如何使用`Object.assign()`: ```javascript var friend = {}; Object.assign(friend, person); friend.sayName(); ...
基于问题的深度学习——“学术引领——问题驱动——自主发展”教学理念解构.pdf
C++98是C++的第一个正式标准,它定义了语言的基本结构,包括面向对象编程(OOP)的概念,如类、继承、多态和模板。C++03是C++98的一个小修订版,主要修正了一些错误并加入了对异常安全性的更强支持。这两个标准奠定...
在C++ 17之前,构造和析构的顺序依赖于声明顺序,而C++ 17规定了统一的顺序:先构造子对象,后构造基对象;先析构基对象,后析构子对象。 8. **改进的字面量操作符(Literal Operator Syntax)** C++ 17支持用户...
《信息时代媒介、受众与社会的关系研究》是马妍妍博士的著作,该书深入探讨了在信息时代背景下,媒介信任的解构与重构。马博士的著作以媒介建构主义为理论基础,从学术史的角度探讨了媒介与受众关系的发展,以及媒介...
存在许多用于构造希尔伯特级数的方法,用于描述瞬时子的模空间。 我们探索了这些不同构造之间的一些潜在的群体理论关系,包括基于SUSY颤动规范理论的库仑分支和希格斯分支的构造,以及基于生成自Weyl字符公式的函数...