C++对象模型笔记(一) C++对象

C++ 支持了数据和方法的联系。

C++ 来说,他的布局成本就是

1.       none static data member

2.       a pointer to virtue table

3.       the pointer to virtue class

而成员函数,并不包括在 C++ 对象里。还而言之,每一个非 inline 成员函数只有一个函数实体。而 inline 成员函数则在调用他的地方,产生一个实体。

 

而对对于返回值为对象的函数,其实本质是返回值对象,是作为一个引用输出参数。

比如 : X foobar()  >>>  void foobar(X &result)

X foobar()

{

       X xx;

       xx.foo();

       return xx;

}

 

C++ 转换为

X foobar(X & _result)

{

       _result.X::X();//xx 返回对象被 _result 代替

       foo(&_result);

       return;

}

 

对于多态,只有通过指针或者引用才能实现。直接运用对象不可实现

比如 :

class A

{

       public:

              virtual void foo()

              int m_a;

};

 

class B : public A

{

public:

              virtual void foo();

int m_b;        

};

 

B b;

A *pA = &b;

pA->foo();// 多态,调用 B::foo();

A &a = b;

a.foo();// 多态,调用 B::foo();

A a = b;

a.foo();// 直接用对象,被切割 , 调用 A::foo();

 

B *pB = &b;

pB pA 的指针值都一样,并且都指向 b 对象的第一个 byte, 他们的区别覆盖范围(

pA ,的范围是 b 中的 A subobject 部分,而 pB 指向的是整个 b 对象范围 ) 和内容解释。

 

内容解释在编译时已决定,

1. 固定接口的调用,即 pA 只能调用 pA none static member 函数,而不能调用 B none static member 函数。

2. 该接口的 access level, 通过 virtue table,pA 调用的 virtual 函数是他所指向对象 (b) 的虚拟函数。

 

 

猜你喜欢

转载自blog.csdn.net/SuperFPE/article/details/6121509
今日推荐