设为首页 加入收藏

TOP

C++ virtual table pointer - vptr(三)
2015-07-20 17:17:04 来源: 作者: 【 】 浏览:11
Tags:virtual table pointer vptr
icj4KNiAgICAgfTxicj4KPGJyPgpJbiB0aGlzIGNhc2UsIHdoZW4gZDEgaXMgY3JlYXRlZCwgX192cHRyIHBvaW50cyB0byBCYXNloa9zIHZpcnR1YWwgdGFibGUsIG5vdCBEMaGvcyB2aXJ0dWFsIHRhYmxlLiBDb25zZXF1ZW50bHksIHBiYXNlLT5fX3ZwdHIgd2lsbCBhbHNvIGJlIHBvaW50aW5nIHRvIEJhc2Whr3MgdmlydHVhbCB0YWJsZS4gQmFzZaGvcyB2aXJ0dWFsIHRhYmxlIGVudHJ5IGZvciBmdW5jdGlvbjEoKSBwb2ludHMgdG8gQmFzZTo6ZnVuY3Rpb24xKCkuIFRodXMsIHBiYXNlLT5mdW5jdGlvbjEoKQogcmVzb2x2ZXMgdG8gQmFzZTo6ZnVuY3Rpb24xKCksIHdoaWNoIGlzIHRoZSBtb3N0LWRlcml2ZWQgdmVyc2lvbiBvZiBmdW5jdGlvbjEoKSB0aGF0IGEgQmFzZSBvYmplY3Qgc2hvdWxkIGJlIGFibGUgdG8gY2FsbC48YnI+Cjxicj4KQnkgdXNpbmcgdGhlc2UgdGFibGVzLCB0aGUgY29tcGlsZXIgYW5kIHByb2dyYW0gYXJlIGFibGUgdG8gZW5zdXJlIGZ1bmN0aW9uIGNhbGxzIHJlc29sdmUgdG8gdGhlIGFwcHJvcHJpYXRlIHZpcnR1YWwgZnVuY3Rpb24sIGV2ZW4gaWYgeW91oa9yZSBvbmx5IHVzaW5nIGEgcG9pbnRlciBvciByZWZlcmVuY2UgdG8gYSBiYXNlIGNsYXNzITxicj4KPGJyPgo8cD5DYWxsaW5nIGEgdmlydHVhbCBmdW5jdGlvbiBpcyBzbG93ZXIgdGhhbiBjYWxsaW5nIGEgbm9uLXZpcnR1YWwgZnVuY3Rpb24gZm9yIGEgY291cGxlIG9mIHJlYXNvbnM6IEZpcnN0LCB3ZSBoYXZlIHRvIHVzZSB0aGUgKl9fdnB0ciB0byBnZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHZpcnR1YWwgdGFibGUuIFNlY29uZCwgd2UgaGF2ZSB0byBpbmRleCB0aGUgdmlydHVhbCB0YWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIHRvIGNhbGwuCiBPbmx5IHRoZW4gY2FuIHdlIGNhbGwgdGhlIGZ1bmN0aW9uLiBBcyBhIHJlc3VsdCwgd2UgaGF2ZSB0byBkbyAzIG9wZXJhdGlvbnMgdG8gZmluZCB0aGUgZnVuY3Rpb24gdG8gY2FsbCwgYXMgb3Bwb3NlZCB0byAyIG9wZXJhdGlvbnMgZm9yIGEgbm9ybWFsIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwsIG9yIG9uZSBvcGVyYXRpb24gZm9yIGEgZGlyZWN0IGZ1bmN0aW9uIGNhbGwuIEhvd2V2ZXIsIHdpdGggbW9kZXJuIGNvbXB1dGVycywgdGhpcyBhZGRlZAogdGltZSBpcyB1c3VhbGx5IGZhaXJseSBpbnNpZ25pZmljYW50LjwvcD4KPHA+PGJyPgo8L3A+CjxwPkJ5IHRoZSB3YXksIGhlcmU="s an example of mine

#if 01
//vptr
#include 
  
   
using namespace std;

class Base
 {
public:
  int a;
  int b;
  Base(int temp1 = 0, int temp2 = 0)
  {
	 a=temp1;
	 b=temp2; 
  }
  virtual ~Base(){std::cout << "~Base()" << std::endl;};

  virtual int getA()  
  {
	 return a;
  }
  virtual int getB()  
  {
	 return b;
  }
};

class Derive: public Base
{
public:
  // *__vptr is inherited by derived classes
  Derive(int d1, int d2):Base(d1,d2){}
  virtual int getA(){return a;}
  virtual int getB(){return b;} 
};

class Empty{
public:
  int e;
};

int main() 
{
  Derive obj(5, 10);
  std::cout << "sizeof class: " << sizeof(Base) << std::endl;

  std::cout << "the &obj :  " << &obj << std::endl;//&obj = the hidden pointer, which we will call *__vptr. *
  std::cout << "the &obj+1: " << &obj + 1 << std::endl;//As sizeof(test) is 16, so  (Base *) + 1 means addr + 16
  std::cout << "the &obj.a: " << &obj.a << std::endl;
  std::cout << "the &obj.b: " << &obj.b << std::endl;
  // Changing a and b by *__vptr
  std::cout << "--------------Set member variable over vptr(8 bytes = 2*sizeof(int), so &a = pInt + 2)--------------" << std::endl;
  int* pInt = (int*)&obj;
  *(pInt+2) = 100;   
  *(pInt+3) = 200;   

  cout << "a = " << obj.getA() << endl;
  cout << "b = " << obj.getB() << endl;
  
  Empty e;
  std::cout << "the &e: " << &e << std::endl;
  std::cout << "the &e.e: " << &e.e << std::endl;//&e = &e.e, so there's no virtual table pointer
  return 0;
}
#endif
  


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇lua学习笔记---选择,循环语句 下一篇Geometry Made Simple

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)