2、章)今天要写的是this指针,虚函数和构造函数初始化的顺序(1)this指针 总是将this指针leaecx,[this],然后再调用成员函数。就是thiscall的函数调用方式。 例程:#include using namespace std;class Base ...{protected: int val;public: int GetVal() ...{ return val; }};int main()...{ Base test; test.GetVal(); return
3、0;} 相应的汇编指令:test.GetVal();lea ecx,[test] call Base::GetVal (42BFCDh) (2)虚函数的实现。对于单继承的类,虚函数表的指针存放在类的开始4个字节,访问虚函数的时候,就是首先取得虚函数表的头指针,然后加一个偏移的量(此偏移量的计算是根据声明虚函数的顺序来定的,也就是说第一个声明的虚函数,偏移量就是0,以此类推),取得函数指针,再进行访问。虚函数损失的效率就是在于比普通函数多了两次访问内存的过程。例程:class B
4、ase ...{protected: int val; int val2;public: virtual int GetVal() ...{ return val; } virtual int GetVal2() ...{ return val2; }};class Child:public Base...{public: virtual int GetVal2() ...{ return 0; }};int main()...{ Child test; Base *p=(Base*)&t
6、函数头指针,接下去是BaseB的成员变量。这样一来造成指向对象自己的BaseB*的基类指针实际指向的是对象地址+sizeof(BaseA),因此如果delete该指针就会出错。例程#include using namespace std;class Base...{protected: int val; int val2;public: virtual int GetVal() ...{ return val; } virtual int GetVal2() ...{ r
7、eturn val2; }};class Base2...{protected: int val;public: virtual int GetVal() ...{ return val; }};class Child:public Base, Base2...{public: virtual int GetVal2() ...{ return 0; }};int main()...{ Child *test= new Child; Base *p=(Base*)test; Base2 *p2 =(Base