Inside the C++ Object Model:构造语意(chapter5)

看到构造语意的其中一节“继承体系下的对象构造”(5.2节)的最后,看来原文,发现侯杰的翻译有问题,怪不得读起来不顺。

What about when providing an argument for a base class
constructor? Is it still physically safe to invoke a virtual function of the
class within its constructor‘s member initialization list? No. The vptr is
either not set or set to the wrong class. Further, any of the data members of
the class that are accessed within the function are guaranteed to not yet be
initialized.

中文写成了“何时需要供应参数给一个base class
constructor?”,其实看下去就知道,这一节与上一节对应的,即在讨论完初始化列表中用virtual函数初始化数据成员后,讨论一下如果用virtual函数在初始化列表中给基类构造函数提供参数的情况(这种情况是不安全的,有问题的)。

时间: 2024-10-07 10:08:25

Inside the C++ Object Model:构造语意(chapter5)的相关文章

Inside the C++ Object Model | Object Lessons

1. 加了封装后的布局存取成本(Layout Costs for Adding Encapsulation) 虚函数机制:用于支持有效率的执行期绑定 虚基类机制:实现在继承中避免重复继承. 2. The C++ Object Model pointer-to-member:避免了成员类型不同所需空间不同的问题,对象的成员是以 slot 的索引值来寻址 data member table: member function table: virtual table(vtbl):每个对象有一个指针指(

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在

inside the C++ Object model总结

一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中若直接将函数实现写在类体内,默认内联.如果函数因其复杂度或构建等问题被判断为不能成为inline函数,它将被转化为一个static函数.如果一个inline函数被调用太多次的话,会产生大量的扩展码,使程序大小暴涨. 2.C++对象模型: 3.组合,而非继承是把C和C++结合的唯一可行方法. 4.C+

Inside The C++ Object Model(五)

============================================================================5-0. 一般而言,class 的data member 应该被初始化,并且只在constructor中是在class 的其他member functions 中指定初值.其他任何操作都将破坏封装性质,是class 的维护和修改更加困难. 图片5-0: (1)纯虚拟函数的存在注:编译器不会在扩展derived class 的destructor时

Inside The C++ Object Model(一)

============================================================================1-1. 关键字struct和class的一点区别:(1)struct内部默认public属性,class内部成员默认private属性:(2)template中只能使用class来抽象类型参数,不能使用struct,template并不打算和C兼容. 1-2. C程序员有时会把单一元素的数组放在一个struct的尾端,于是每个struct ob

Inside The C++ Object Model(三)

============================================================================3-0. 类所占的内存大小受到三个因素的影响:(1)语言本身所造成的额外负担(Virtual base classes):(2)编译器对于特殊情况所提供的优化处理(空基类优化):(3)Alignment的限制(对齐):注:Empty Virtual base class提供一个Virtual interface,没有定义任何数据,某些编译器对此提

Inside The C++ Object Model(四)

============================================================================4-1. Member 的各种调用方式静态成员函数(static member functions,不属于对象,没有this指针)不能直接存取Nonstatic数据:同时不能被声明为const(const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数--this指针由原来的Class* const变为const Clas

Inside The C++ Object Model(二)

============================================================================2-0. 关键字explicit被引入C++,提供给程序员一种方法,使他们能够制止"单一参数的constructor"被当做一个conversion运算符. ============================================================================2-1.Default Co

重温《Inside The C++ Object Model》(2) --Default-Constructor的建构操作

//constructor/non-constructor的区别 class Foo { public: //Foo():val(0),next(NULL) {} int val; Foo *next; }; void foo_bar() { Foo bar; if ( bar.val && bar.next ) { cout << bar.val << endl; printf("%p\n", bar.next); cout <<