590
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma pack (push, 1)
//we define 2 classes
class A {
private:
static uint8_t s;
uint8_t m1 = 3;
protected:
uint8_t m2 = 4;
public:
void add () { cout << m1 * m2 * s<<"\n";}
virtual void fun () {cout << "(-:<\n";}
};
uint8_t A::s = 10;
class B :public A {
public:
B():A(){}
uint8_t m3 = 5;
virtual void fun () {cout << ")-:<\n";}
};
//we define a C struct
struct sblock {
void ** fun;
uint8_t m1;
uint8_t m2;
uint8_t m3;
};
#pragma pack(pop)
typedef void (*c_fun) (void *);
int main(int /*argc*/, char * /*argv*/[])
{
//block is a struct
sblock block;
void * blockfun = ( void * ) &B::fun;
block.m1 = 3;
block.m2 = 4;
block.m3 = 5;
block.fun = &blockfun;
//we force a pointer convert
A * p = (A *) █
//call
p->add();
p->fun();
//we call a C++ function using C function pointer
A b;
c_fun cfun = (c_fun) &A::fun;
cfun (&b);
return 0;
}
120
)-:<
(-:<
在GNU C++编译器archlinux x64环境测试通过。对GNU C++编译器而言,这种测试尤为简单。对MSVC编译器,就复杂一些。因为windows下,C++ 的成员函数和 C 具有不同的栈操作。
#include <iostream>
#include <string>
using namespace std;
#pragma pack (push, 1)
class A {
public:
uint32_t m_a;
A(int a):m_a(a) {}
};
class B {
private:
uint32_t m_b;
public:
B():m_b(1) {}
void print ()
{
cout << "B::print :"<< m_b << endl;
}
};
class C {
public:
uint32_t m_c;
C():m_c(2) {}
virtual void print ()
{
cout << "C::print :"<< m_c << endl;
}
};
class C1 : public C{
public:
uint16_t m_c1;
C1():C(),m_c1(3) {}
virtual void print ()
{
cout << "C1::print :"<< m_c << "," << m_c1 << endl;
}
};
class C2 : public C{
public:
string m_c2;
C2():C(),m_c2("four") {}
virtual void print ()
{
cout << "C1::print :"<< m_c << "," << m_c2 << endl;
}
};
#pragma pack (pop)
int main(int arc, char * argv[])
{
cout<<"size of class A is " << sizeof(A) << endl;
cout<<"size of class B is " << sizeof(B) << endl;
cout<<"size of class C is " << sizeof(C) << endl;
cout<<"size of class C1 is " << sizeof(C1) << endl;
cout<<"size of class string is " << sizeof(string) << endl;
cout<<"size of class C2 is " << sizeof(C2) << endl;
return 0;
}
size of class A is 4
size of class B is 4
size of class C is 12
size of class C1 is 14
size of class string is 32
size of class C2 is 44