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