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) 的虚拟函数。