c++的继承布局/多态

来源:互联网 发布:书生软件推广 编辑:程序博客网 时间:2024/06/08 17:37
#include <iostream>
using namespace std;
//复杂的继承


                     //钻石型继承
class B
{
public:
int ib;
char cb;
B():ib(0),cb('b'){cout<<"B()\n";}
virtual void f(){cout<<"B::f()\n";}
virtual void Bf(){cout<<"B::Bf()\n";}
};


class B1 : virtual  public B
{
public:
int ib1;
char cb1;
public:
B1():ib1(11),cb1('1') {cout<<"B1()\n";}


virtual void f() { cout << "B1::f()" << endl;}
virtual void f1() { cout << "B1::f1()" << endl;}
virtual void Bf1() { cout << "B1::Bf1()" << endl;}


};


class B2 :   virtual public B
{
public:
int ib2;
char cb2;
public:
B2():ib2(11),cb2('1') {cout<<"B2()\n";}


virtual void f() { cout << "B2::f()" << endl;}
virtual void f2() { cout << "B2::f2()" << endl;}
virtual void Bf2() { cout << "B2::Bf2()" << endl;}


};


class D : public B1, public B2
{
public:
int id;
char cd;
public:
D():id(100),cd('D') {cout<<"D()\n";}


virtual void f() { cout << "D::f()" << endl;}
virtual void f1() { cout << "D::f1()" << endl;}
virtual void f2() { cout << "D::f2()" << endl;}
virtual void Df() { cout << "D::Df()" << endl;}


};


int main()
{
B1 b1;
int **p = (int**)&b1;
cout<<p[1][0]<<"\n";
cout<<p[1][1]<<"\n";
}


#if 0
int main()
{
D d;
cout<<sizeof(d)<<"\n";
}
#endif


/*
class D size(60):
+---
| +--- (base class B1)
0      | | {vfptr}
4      | | {vbptr}
8      | | ib1
12      | | cb1
| | <alignment member> (size=3)
| +---
| +--- (base class B2)
| | +--- (base class B)
16      | | | {vfptr}
20      | | | ib
24      | | | cb
| | | <alignment member> (size=3)
| | +---
28      | | ib2
32      | | cb2
| | <alignment member> (size=3)
| +---
36      | id
40      | cd
| <alignment member> (size=3)
+---
44      | (vtordisp for vbase B)
+--- (virtual base B)
48      | {vfptr}
52      | ib
56      | cb
| <alignment member> (size=3)
+---


D::$vftable@B1@:
| &D_meta
|  0
0      | &D::f1
1      | &B1::Bf1
2      | &D::Df


D::$vftable@:
| -16
0      | &D::f
1      | &B::Bf
2      | &D::f2
3      | &B2::Bf2


D::$vbtable@:
0      | -4
1      | 44 (D d(B1+4)B)


D::$vftable@B@:
| -48
0      | &(vtordisp) thunk: this-=32; goto D::f
1      | &B::Bf
*/
#if 0
                     //重复继承
class B
{
public:
int ib;
char cb;
B():ib(0),cb('b'){}
virtual void f(){cout<<"B::f()\n";}
virtual void Bf(){cout<<"B::Bf()\n";}
};


class B1 :  public B
{
public:
int ib1;
char cb1;
public:
B1():ib1(11),cb1('1') {}


virtual void f() { cout << "B1::f()" << endl;}
virtual void f1() { cout << "B1::f1()" << endl;}
virtual void Bf1() { cout << "B1::Bf1()" << endl;}


};


class B2 :  public B
{
public:
int ib2;
char cb2;
public:
B2():ib2(11),cb2('1') {}


virtual void f() { cout << "B2::f()" << endl;}
virtual void f2() { cout << "B2::f2()" << endl;}
virtual void Bf2() { cout << "B2::Bf2()" << endl;}


};


class D : public B1, public B2
{
public:
int id;
char cd;
public:
D():id(100),cd('D') {}


virtual void f() { cout << "D::f()" << endl;}
virtual void f1() { cout << "D::f1()" << endl;}
virtual void f2() { cout << "D::f2()" << endl;}
virtual void Df() { cout << "D::Df()" << endl;}


};


int main()
{
D d;
}
/*
class D size(48):
+---
| +--- (base class B1)
| | +--- (base class B)
0      | | | {vfptr}
4      | | | ib
8      | | | cb
| | | <alignment member> (size=3)
| | +---
12      | | ib1
16      | | cb1
| | <alignment member> (size=3)
| +---
| +--- (base class B2)
| | +--- (base class B)
20      | | | {vfptr}
24      | | | ib
28      | | | cb
| | | <alignment member> (size=3)
| | +---
32      | | ib2
36      | | cb2
| | <alignment member> (size=3)
| +---
40      | id
44      | cd
| <alignment member> (size=3)
+---


D::$vftable@B1@:
| &D_meta
|  0
0      | &D::f
1      | &B::Bf
2      | &D::f1
3      | &B1::Bf1
4      | &D::Df


D::$vftable@B2@:
| -20
0      | &thunk: this-=20; goto D::f
1      | &B::Bf
2      | &D::f2
3      | &B2::Bf2
*/




#endif 






#if 0
                     //多重继承
class Base1 {
public:
int ibase1;
Base1():ibase1(10) {}
virtual void f() { cout << "Base1::f()" << endl; }
virtual void g() { cout << "Base1::g()" << endl; }
virtual void h() { cout << "Base1::h()" << endl; }


};


class Base2 {
public:
int ibase2;
Base2():ibase2(20) {}
virtual void f() { cout << "Base2::f()" << endl; }
virtual void g() { cout << "Base2::g()" << endl; }
virtual void h() { cout << "Base2::h()" << endl; }
};


class Base3 {
public:
int ibase3;
Base3():ibase3(30) {}
virtual void f() { cout << "Base3::f()" << endl; }
virtual void g() { cout << "Base3::g()" << endl; }
virtual void h() { cout << "Base3::h()" << endl; }
};




class Derive : public Base1, public Base2, public Base3 {
public:
int iderive;
Derive():iderive(100) {}
virtual void f() { cout << "Derive::f()" << endl; }
virtual void g1() { cout << "Derive::g1()" << endl; }
};


int main()
{
Derive d;
return 0;
}


/*
class Derive    size(28):
+---
| +--- (base class Base1)
0      | | {vfptr}
4      | | ibase1
| +---
| +--- (base class Base2)
8      | | {vfptr}
12      | | ibase2
| +---
| +--- (base class Base3)
16      | | {vfptr}
20      | | ibase3
| +---
24      | iderive
+---


Derive::$vftable@Base1@:
| &Derive_meta
|  0
0      | &Derive::f
1      | &Base1::g
2      | &Base1::h
3      | &Derive::g1


Derive::$vftable@Base2@:
| -8
0      | &thunk: this-=8; goto Derive::f
1      | &Base2::g
2      | &Base2::h


Derive::$vftable@Base3@:
| -16
0      | &thunk: this-=16; goto Derive::f
1      | &Base3::g
2      | &Base3::h


Derive::f this adjustor: 0


Derive::g1 this adjustor: 0
*/
#endif 


#if 0


                       //单一继承


class Parent
{
public:
int iparent;
Parent():iparent(10){}
virtual void f()
{
cout<<"Parent::f()\n";
}
virtual void g()
{
cout<<"Parent::g()\n";
}
virtual void h()
{
cout<<"Parent::h()\n";
}
};


class Child:public Parent
{
public:
int ichild;
Child():ichild(100){}
virtual void f(){ cout<<"Child::f()\n";}
virtual void g_child() { cout << "Child::g_child()\n"; }
virtual void h_child() { cout << "Child::h_child()\n"; }
};


class GrandChild:public Child
{
public:
int igrandchild;
GrandChild():igrandchild(1000) {}
virtual void f() { cout << "GrandChild::f()" << endl; }
virtual void g_child() { cout << "GrandChild::g_child()" << endl; }
virtual void h_grandchild() { cout << "GrandChild::h_grandchild()" << endl; }
};
/*
child :           GrandChild:
&Child::f() ----->GranChiuld::f()
&Parent::g  ----->&Parent::g
        &Parent::h  ----->&Parent::h
&Child::g_child()->GrandChild::g_child()
&Child::h_child()->Child::h_child()
                ->GrandChild::h_grandchild()
iParent
ichild
iGrandChild
*/


typedef void (*FUN)();


int main()
{
FUN pFun = NULL;
GrandChild g;
int **pVtab = (int**)&g;
/*for(int i = 0; (FUN)pVtab[0][i] != NULL; ++i)
{
pFun = (FUN)pVtab[0][i];
pFun();
}*/
cout<<(int)pVtab[1]<<"\n";10
cout<<(int)pVtab[2]<<"\n";100
cout<<(int)pVtab[3]<<"\n";1000
}
#endif
//简单的继承
#if  0
class Base1 
{
public:
virtual void f() { cout << "Base1::f" << endl; }
virtual void g() { cout << "Base1::g" << endl; }
virtual void h() { cout << "Base1::h" << endl; }
};


class Base2 {
public:
virtual void f() { cout << "Base2::f" << endl; }
virtual void g() { cout << "Base2::g" << endl; }
virtual void h() { cout << "Base2::h" << endl; }
};


class Base3 {
public:
virtual void f() { cout << "Base3::f" << endl; }
virtual void g() { cout << "Base3::g" << endl; }
virtual void h() { cout << "Base3::h" << endl; }
};




class Derive : public Base1, public Base2, public Base3 {
public:
virtual void f() { cout << "Derive::f" << endl; }
virtual void g1() { cout << "Derive::g1" << endl; }
};
typedef void(*Fun)(void);




int main()
{
Fun pFun = NULL;
Derive d;
int **pVtab = (int**)&d;


pFun = (Fun)pVtab[0][0];
pFun();
pFun = (Fun)pVtab[0][1];
pFun();
pFun = (Fun)pVtab[0][2];
pFun();
pFun = (Fun)pVtab[0][3];
pFun();
pFun = (Fun)pVtab[1][0];
pFun();
pFun = (Fun)pVtab[1][1];
pFun();
pFun = (Fun)pVtab[1][2];
pFun();
pFun = (Fun)pVtab[2][0];
pFun();
pFun = (Fun)pVtab[2][1];
pFun();
pFun = (Fun)pVtab[2][2];
pFun();


}


Derive::f
Base1::g
Base1::h
Derive::g1
Derive::f
Base2::g
Base2::h
Derive::f
Base3::g
Base3::h


#endif


#if 0
class Base
{
public:
virtual void f(int i = 1)
{
cout<<"Base::f()"<<i<<"\n";
}
};


class Drive:public Base
{
public:
void f(int  i = 2)               //函数值相同,参数列表相同才能够重写,返回值不同会被认为同一函数
{
cout<<"Drive::f()"<<i<<"\n";
}


};


typedef void (*PFU)();


int main()
{
Drive d;
Base *p = &d;
p->f(3);
//Base *p = &d;  //子类私有方法也能重载
//p->f();
/*PFU pFun = (PFU)*(int*)(*(int*)(&d));
pFun();*/
}
#endif


#if 0
class Base1
{
public:
virtual void f1()
{
cout<<"Base1::f1()\n";
}
virtual void g1()
{
cout<<"Base1::g1()\n";
}
virtual void h1()
{
cout<<"Base1::h1()\n";
}


};


class Base2
{
public:
virtual void f1()
{
cout<<"Base2::f1()\n";
}
virtual void g2()
{
cout<<"Base2::g2()\n";
}
virtual void h2()
{
cout<<"Base2::h2()\n";
}


};
class Drive:public Base1,public Base2
{
public:
virtual void f1()
{
cout<<"Drive::f1()\n";
}
virtual void g2()
{
cout<<"Drive::g2()\n";
}
virtual void h3()
{
cout<<"Drive::h3()\n";
}
};




typedef void (*Fun)(void);


int main()
{
Drive d;
Base1 *b1 = &d;
Base2 *b2 = &d;
d.f1();
b1->f1();
b2->f1();


/*Drive b;
Fun pFun = NULL;
cout<<"虚函数表地址:"<<(int*)(&b)<<"\n";
cout<<"第一个函数地址:"<<(int*)*(int*)(&b)<<"\n";*/


/*pFun = (Fun)*((int*)*(int*)(&b));
pFun();
pFun = (Fun)*((int*)*(int*)(&b)+1);
pFun();
pFun = (Fun)*((int*)*(int*)(&b)+2);
pFun();
pFun = (Fun)*((int*)*(int*)(&b)+3);
pFun();
pFun = (Fun)*((int*)*(int*)(&b)+4);
pFun();
pFun = (Fun)*((int*)*(int*)(&b)+5);
pFun();*/
}
#endif


#if 0
class A
{
public:
A(int a):_a(a){cout<<"A()\n";}
private:
public:
int _a;
};


class B
{
public:
B(int b):_b(b){cout<<"B()\n";}
private:
int _b;
};


class C :public A,public B
{
public:
C(int c = 0):_c(c),A(c),B(c){cout<<"C()\n";}
private:
int _c;
};


int main()
{
C c;
}
#endif
0 0
原创粉丝点击