标签:完成 静态 table div 动态 决定 代码 stream src
C++的类支持三种member function:static,nonstatic,virtual。
编译器会将nonstatic member function转换为普通外部函数。
1 #include <iostream> 2 3 using namespace std; 4 5 class A{ 6 public: 7 int x = 5; 8 int y = 6; 9 int add() 10 { 11 return x + y; 12 } 13 }; 14 15 int main() 16 { 17 A a; 18 a.add(); 19 return 0; 20 }
以上述代码为例,具体步骤如下:
对虚函数的调用会经由vptr及其偏移量来定位,并插入this指针。
1 #include <iostream> 2 2 3 3 using namespace std; 4 4 5 5 class A{ 6 6 public: 7 7 int x = 5; 8 8 int y = 6; 9 9 virtual int add() 10 10 { 11 11 return x + y; 12 12 } 13 13 }; 14 14 15 15 int main() 16 16 { 17 17 A a; 18 18 a.add(); 19 19 return 0; 20 20 }
以上述代码为例,a.add()会被编译器转换为(*(&a->vptr[1])) (this)。
引入了RTTI后,能在执行期确定对象类型。在编译期,只知道通过&a或者指向a的指针能够找到对象的virtual table,以及函数在表中的偏移量。
static member function的主要特性是没有this指针,所以它不能直接存取nonstatic member data,不能将static member function定义为const,volatile或virtual。
1 #include <iostream> 2 3 using namespace std; 4 5 class A{ 6 public: 7 int x = 5; 8 int y = 6; 9 static int add() 10 { 11 cout << "static member function" << endl; 12 } 13 }; 14 15 int main() 16 { 17 A a; 18 A* p = &a; 19 a.add(); //通过对象调用 20 p->add(); //通过对象指针调用 21 A::add(); //通过类调用 22 return 0; 23 }
《深度探索C++对象模型》
标签:完成 静态 table div 动态 决定 代码 stream src
原文地址:https://www.cnblogs.com/chen-cs/p/13092552.html