C++ Inheritance

来源:互联网 发布:淘宝卖家怎么入驻一淘 编辑:程序博客网 时间:2024/05/26 19:19

 

----------- Class A---------------

class A

{
public:
       virtual void foo1() { printf("in A::foo1()/n");};
       virtual void foo2() { printf("in A::foo2()/n"); }
       
public:
        A():a1('A') {};
        int a1;
};

 

[X+0x0]:0x21420
[X+0x4]:0x41

 

----------- Class B---------------

 

         A
       /
     B

 

class B : public A
{
public:
       virtual void foo1() { printf("in B::foo1()/n"); }
       virtual void foo2() { printf("in B::foo2()/n"); }
      
public:
       B():b1('B'),b2('B') {};
       int b1;
       int b2;
};

 

[X+0x0]:0x215c8
[X+0x4]:0x41
[X+0x8]:0x42
[X+0xc]:0x42

 

----------- Class B (virtual inheritance)---------------

         A
       / (virtual)
     B

 

class B : virtual public A
{
public:
       virtual void foo1() { printf("in B::foo1()/n"); }
       virtual void foo2() { printf("in B::foo2()/n"); }
      
public:
       B():b1('B'),b2('B') {};
       int b1;
       int b2;
};

 

[X+0x0]:0x21640                     #virtual table of class B
[X+0x4]:0x42
[X+0x8]:0x42
[X+0xc]:0x21640+0x10           #virtual table of class A
[X+0x10]:0x41

 

----------- Class D --------------

         A
       /    /
     B     C 
       /    /
         D

 

class B : public A
{
public:
       virtual void foo1() { printf("in B::foo1()/n"); }
       virtual void foo2() { printf("in B::foo2()/n"); }
      
public:
       B():b1('B'),b2('B') {};
       int b1;
       int b2;
};

 

class C : public A

{
public:
       virtual void foo1() { printf("in C::foo1()/n"); }
       virtual void foo2() { printf("in C::foo2()/n"); }

public:
       C():c1('C'),c2('C'),c3('C') {};
       int c1;
       int c2;
       int c3;
};

 

class D : public B, public C
{
public:
       virtual void foo1() { printf("in D::foo1()/n"); }
       virtual void foo2() { printf("in D::foo2()/n"); }

public:
       D():d1('D'),d2('D'),d3('D'),d4('D') {};
       int d1;
       int d2;
       int d3;
       int d4;      
}; 

 

 

[X+0x0]:0x219d8
[X+0x4]:0x41
[X+0x8]:0x42
[X+0xc]:0x42

[X+0x10]:0x219d8+0x10
[X+0x14]:0x41
[X+0x18]:0x43
[X+0x1c]:0x43
[X+0x20]:0x43

[X+0x24]:0x44
[X+0x28]:0x44
[X+0x2c]:0x44
[X+0x30]:0x44

 

----------- Class D (virtual inheritance)---------------

 

         A
       /    / (virtual)
     B     C 
       /    /
         D

 

class B : virtual public A
{
public:
       virtual void foo1() { printf("in B::foo1()/n"); }
       virtual void foo2() { printf("in B::foo2()/n"); }
      
public:
       B():b1('B'),b2('B') {};
       int b1;
       int b2;
};

 

class C : virtual public A

{
public:
       virtual void foo1() { printf("in C::foo1()/n"); }
       virtual void foo2() { printf("in C::foo2()/n"); }

public:
       C():c1('C'),c2('C'),c3('C') {};
       int c1;
       int c2;
       int c3;
};

 

 

[X+0x0]:0x21b20
[X+0x4]:0x42
[X+0x8]:0x42
[X+0xc]:0x21b20+0x18
[X+0x10]:0x43
[X+0x14]:0x43
[X+0x18]:0x43
[X+0x1c]:0x44
[X+0x20]:0x44
[X+0x24]:0x44
[X+0x28]:0x44
[X+0x2c]:0x21b20+0x28
[X+0x30]:0x41

 

---------------------------------------------------------------------------------------------------------

#include <iostream>

using namespace std;

class A
{
public:
       virtual void foo1() { printf("in A::foo1()/n"); };
       virtual void foo2() { printf("in A::foo2()/n"); }
      
public:
        A():a1('A') {};
        int a1;
};

//class B : virtual public A
class B : public A
{
public:
       virtual void foo1() { printf("in B::foo1()/n"); }
       virtual void foo2() { printf("in B::foo2()/n"); }
     
public:
       B():b1('B'),b2('B') {};
       int b1;
       int b2;
};

//class C : virtual public A
class C : public A
{
public:
       virtual void foo1() { printf("in C::foo1()/n"); }
       virtual void foo2() { printf("in C::foo2()/n"); }

public:
       C():c1('C'),c2('C'),c3('C') {};
       int c1;
       int c2;
       int c3;
};


class D : public B, public C
{
public:
       virtual void foo1() { printf("in D::foo1()/n"); }
       virtual void foo2() { printf("in D::foo2()/n"); }

public:
       D():d1('D'),d2('D'),d3('D'),d4('D') {};
       int d1;
       int d2;
       int d3;
       int d4;     
};

int main()
{
#define X D

X d;
int * p = (int *)&d;
int size = sizeof (X)/4;
for (int i=0;i<size;i++)
if ((*(p+i)) > (*p))
printf("[X+0x%x]:0x%x+0x%x/n", i*4,(*p), (*(p+i)) - (*p));
else
printf("[X+0x%x]:0x%x/n", i*4,(*(p+i)));
}