`
switchlau
  • 浏览: 54440 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

继承体系下的对象构造与解构——《Inside The C++ Object Model》之三

阅读更多

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

 

分享到:
评论

相关推荐

    Inside the C++ Object Model.rar

    《Inside the C++ Object Model》是一本深入探讨C++对象模型的权威著作,由Stanley B. Lippman撰写,是C++程序员深入了解语言底层机制的必读经典。这本书主要涵盖了C++对象模型的各个方面,包括内存管理、类型系统、...

    深度探索C++对象模型 超清版

    5.2 继承体系下的对象构造 虚拟继承(Virtual Inheritance) 初始化语意学(The Semantics of the vptr Initialization) 5.3 对象复制语意学(Object Copy Semantics) 5.4 对象的功能(Object Efficiency) 5.5 ...

    C++对象模型.pdf

    本书致力于深入解析C++编译器在处理C++代码时所采取的复杂对象模型及其背后的底层机制,特别是针对构造函数、解构函数、虚函数、继承、多态等面向对象特性的工作原理。通过对这些内容的深入讲解,读者将能够掌握C++...

    服装设计——解构主义与插画在服装设计中的应用(1).zip

    在"服装设计——解构主义与插画在服装设计中的应用.docx"文档中,可能详细介绍了如何将解构主义和插画这两种元素融入到服装设计的过程。内容可能包括以下几个方面: 1. 解构主义的历史背景和发展:简述解构主义的...

    C++编程惯用法——高级程序员常用方法和技巧.rar

    10. **C++11/14/17/20新特性**:每个C++标准版本都引入了许多新特性,如类型推断(auto)、初始化列表、统一的构造/解构、并发编程支持等。熟悉这些新特性,可以使你的C++编程技能与时俱进。 以上只是C++高级编程中的...

    Python构造函数及解构函数介绍

    在Python编程语言中,构造函数和解构函数是两个非常重要的概念。构造函数是一种特殊的方法,它在创建对象时自动被调用,用来初始化对象的属性。而解构函数则是在对象被删除前调用的特殊方法,用于执行一些清理工作。...

    [modern c++]tuple的使用(csdn)————程序.pdf

    在现代C++编程中,`tuple`是一种强大的数据结构,它可以容纳不同类型的数据,并提供了一种紧凑的方式来存储和操作异构数据集。`tuple`的概念源自数学中的元组,它允许我们在一个单一的实体中组合不同类型的值。在C++...

    服装设计——解构主义与插画在服装设计中的应用.zip

    随着艺术的多元发展与设计理念的不断更新,解构主义与插画在服装设计中的应用已成为时尚前沿探索的新方向。解构主义,最初是作为一种哲学思想,在20世纪末的建筑和艺术领域中引发了深远的变革,其后渗透进服装设计...

    服装设计——解构主义与插画在服装设计中的应用.docx

    ### 服装设计——解构主义与插画在服装设计中的应用 #### 解构主义的定义与在服装设计中的应用 解构主义作为一种重要的后现代主义思潮,它反对传统意义上的秩序与规则,主张打破固有的结构框架,追求无限的可能性...

    商道纵横&SAP:2022中国企业零碳战略——解构实现“双碳”目标之路(英文).pdf

    商道纵横&SAP:2022中国企业零碳战略——解构实现“双碳”目标之路(英文)

    商道纵横&SAP:2022中国企业零碳战略——解构实现“双碳”目标之路(中文).pdf

    商道纵横&SAP:2022中国企业零碳战略——解构实现“双碳”目标之路(中文)

    ES6 对象的新功能与解构赋值介绍

    `Object.assign()`方法用于合并多个对象到一个目标对象,但并不涉及原型链的继承。以下例子展示了如何使用`Object.assign()`: ```javascript var friend = {}; Object.assign(friend, person); friend.sayName(); ...

    基于问题的深度学习——“学术引领——问题驱动——自主发展”教学理念解构.pdf

    基于问题的深度学习——“学术引领——问题驱动——自主发展”教学理念解构.pdf

    C++98/C++03/C++11/C++14/C++17/C++20 标准帮助文档 2020-09-04

    C++98是C++的第一个正式标准,它定义了语言的基本结构,包括面向对象编程(OOP)的概念,如类、继承、多态和模板。C++03是C++98的一个小修订版,主要修正了一些错误并加入了对异常安全性的更强支持。这两个标准奠定...

    C++ 17 标准手册_C++_

    在C++ 17之前,构造和析构的顺序依赖于声明顺序,而C++ 17规定了统一的顺序:先构造子对象,后构造基对象;先析构基对象,后析构子对象。 8. **改进的字面量操作符(Literal Operator Syntax)** C++ 17支持用户...

    媒介信任的解构与重构——评马妍妍博士的新作《信息时代媒介、受众与社会的关系研究》.pdf

    《信息时代媒介、受众与社会的关系研究》是马妍妍博士的著作,该书深入探讨了在信息时代背景下,媒介信任的解构与重构。马博士的著作以媒介建构主义为理论基础,从学术史的角度探讨了媒介与受众关系的发展,以及媒介...

    单瞬时Hilbert级数的构造和解构

    存在许多用于构造希尔伯特级数的方法,用于描述瞬时子的模空间。 我们探索了这些不同构造之间的一些潜在的群体理论关系,包括基于SUSY颤动规范理论的库仑分支和希格斯分支的构造,以及基于生成自Weyl字符公式的函数...

    C++标准文档

    C++是一种广泛使用的面向对象的编程语言,其标准历经多个版本的发展,逐步增加了新的特性,提高了效率和灵活性。本文将详细介绍C++03、C++11、C++14和C++17这四个主要版本的关键知识点。 C++03是C++的早期标准,它...

    C++ 17 标准手册 c++

    C++ 17是C++编程语言的一个重要版本,它引入了许多新的特性和改进,旨在提升效率、可读性以及代码的简洁性。这个标准手册详细涵盖了这些变化,为开发者提供了全面的指导。 1. **模块化(Modules)**:C++ 17引入了...

Global site tag (gtag.js) - Google Analytics