深度探索C++对象模型--------C++对象模型
2012-12-18 11:11
423 查看
一:C++对象模型(The C++ Object Model)
1:不带继承的C++对象模型
在C++中,有两种class data members: static 和 nonstatic,以及三种Class member functions : static,nonstatic和virtual。
比如下面的class Point 声明
这个class Point 在机器中将会被怎么样的表现呢?我们的编译器如何模塑出各种data members 和 function members 呢?
如上图,在C++模型中,Nonstatic data members 被配置于每一个class object 之内,static data members则被放置于所有的class object 之外,Static 和 nonstatic function members 也被放在所有的class object 之外。
而对于Virtual functions ,首先每一个class 产生出一堆指向virtual functions 的指针,放在表格之中,这个表格被称之为virtual table;然后,每一个class object 被添加了一个指向这个virtual functions表格的指针。而在运行时候表现出来的多态也是由这个virtual functions的指针支持,在随后的笔记中我们会讲到。
2:加上继承(Adding Inheritance)
C++ 支持单继承和多继承。例如
class Library_materials {...};
class Book : public Library_materials {.....};
class Rental_book :public Book {...}; ....单继承模型
class iostream :
public istream,
public ostream{...};
class istream :virtual pubulic ios {...};
class ostream : virtual public ios {...}; ....多继承模型
在虚拟继承中,base class 不论被继承串联中被派生多少次,永远只会存在一个实体,virtual 虚拟 即共享的意思。所有的派生类共享这一个base class 实体。
多继承结构中,derived class 塑造base class 模型呢,他沿用的是对virtual functions 的方法,即每一个class object 内含有一个vptr(即志向 base class table的指针) 于是就有了下图:
二: 对象模型如何影响程序
看下面的程序:其中class X定义了一个copy constructor,一个virtual destructor 和 一个virtual function foo:
上面这个函数将被转换成如下的函数:
这个扩展的函数中,使用vtbl 去扩展对virtual 函数的调用,可以让大家更明白virtual function table对程序产生的影响,参照这个模型的设计,我们也可以去扩展vptr(指向virtual base class的指针)。有兴趣的网友可以去扩展下。
1:不带继承的C++对象模型
在C++中,有两种class data members: static 和 nonstatic,以及三种Class member functions : static,nonstatic和virtual。
比如下面的class Point 声明
class Point { public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print(ostream &os) const; float _x; static int _point_count; };
这个class Point 在机器中将会被怎么样的表现呢?我们的编译器如何模塑出各种data members 和 function members 呢?
如上图,在C++模型中,Nonstatic data members 被配置于每一个class object 之内,static data members则被放置于所有的class object 之外,Static 和 nonstatic function members 也被放在所有的class object 之外。
而对于Virtual functions ,首先每一个class 产生出一堆指向virtual functions 的指针,放在表格之中,这个表格被称之为virtual table;然后,每一个class object 被添加了一个指向这个virtual functions表格的指针。而在运行时候表现出来的多态也是由这个virtual functions的指针支持,在随后的笔记中我们会讲到。
2:加上继承(Adding Inheritance)
C++ 支持单继承和多继承。例如
class Library_materials {...};
class Book : public Library_materials {.....};
class Rental_book :public Book {...}; ....单继承模型
class iostream :
public istream,
public ostream{...};
class istream :virtual pubulic ios {...};
class ostream : virtual public ios {...}; ....多继承模型
在虚拟继承中,base class 不论被继承串联中被派生多少次,永远只会存在一个实体,virtual 虚拟 即共享的意思。所有的派生类共享这一个base class 实体。
多继承结构中,derived class 塑造base class 模型呢,他沿用的是对virtual functions 的方法,即每一个class object 内含有一个vptr(即志向 base class table的指针) 于是就有了下图:
二: 对象模型如何影响程序
看下面的程序:其中class X定义了一个copy constructor,一个virtual destructor 和 一个virtual function foo:
X foobar() { X xx; X *px = new X(); //foo() 是一个virtual function xx.foo(); px->foo(); delete px; return xx; }
上面这个函数将被转换成如下的函数:
void foobar(X &_result) { //构造 _result //_result 来替换 local xx .... _result.X::X(); //扩展 X *px = new X() px = _new(sizeof(X)); if(px != 0) px->X::X(); //扩展 xx.foo() 但是不使用virtual 机制 // 以 _result 取代 xx foo( &_result); //使用virtual 机制扩展 px->foo() (*px->vtbl[2]) (px); //扩展 delete px if( px != 0) { ( *px->vtbl[1])(px); _delete (px); } return ; }
这个扩展的函数中,使用vtbl 去扩展对virtual 函数的调用,可以让大家更明白virtual function table对程序产生的影响,参照这个模型的设计,我们也可以去扩展vptr(指向virtual base class的指针)。有兴趣的网友可以去扩展下。
相关文章推荐
- 深度探索C++对象模型
- 读【深度探索C++对象模型】【中】
- 《深度探索C++ 对象模型》第三章读书笔记
- 深度探索C++ 对象模型第91页的疑问
- 深度探索C++ 对象模型【第七章1】
- 深度探索c++对象模型之placement operator new语意
- 深度探索C++ 对象模型【第一章3】
- 深度探索C++对象模型【第三章2】
- 读【深度探索C++对象模型】【上】
- 深度探索C++对象模型——构造函数
- 【C++】深度探索C++对象模型之执行期语意学
- 深度探索C++对象模型学习笔记——Function语意学
- 深度探索c++对象模型之带有constructor类数组的new语义学
- 深度探索C++对象模型:5.构造、析构、拷贝语意学
- 深度探索c++对象模型之member function的具现行为
- 深度探索c++对象模型 小结【转】
- 深度探索C++对象模型之:理解虚函数机制
- 读【深度探索C++对象模型】【上】
- 读【深度探索C++对象模型】【上】
- 【深度探索c++对象模型】关于对象