//深入理解一下繼承以及虛函數的空間大小
#include
using namespace std;
class A
{
char A[100];
};
class B:public A
{
char B[100];
};
class C:public A
{
char C[100];
};
class D:public B,public C
{
char D[100];
};
//對其它類的虛繼承
class E:public virtual A
{
char E[100];
};
class F:public virtual B
{
char F[100];
};
//函數傳參獲取數組長度的方法
template
void printArrLength(T (&C)[N])
{
cout << "C[] spare mem space is " << sizeof(C) << endl;
cout << "C[] length is " << N << endl;
cout << "The array typebyte is " << sizeof(C)/N << endl;
}
/*
詳細的講解
虛繼承:在繼承定義中包含了virtual關鍵字的繼承關系
虛基類:在虛函數體系中的,通過virtual繼承而來的基類,需要注意的是:
class CSubClass:public virtual CBase {};
其中,CBase稱為CSubClass的虛基類,而不是說CBase就是個虛基類
*/
struct CBaseClass1
{
CBaseClass1(size_t n):m_val(n) {}
public:
size_t m_val;
};
struct CSubClassV1:public virtual CBaseClass1
{
CSubClassV1(size_t n):CBaseClass1(n) {}
};
struct CSubClassV2:public virtual CBaseClass1
{
CSubClassV2(size_t n):CBaseClass1(n) {}
};
struct CDiamondClass1:public CSubClassV1,public CSubClassV2
{
CDiamondClass1(size_t n):CBaseClass1(n),CSubClassV1(n),CSubClassV2(n) {}
};
struct CDiamondSubClass1:public CDiamondClass1
{
CDiamondSubClass1(size_t n):CBaseClass1(n),CDiamondClass1(n) {}
};
//函數指針
void fa() { cout << "hello fa" << endl; }
void fb() { cout << "hello fb" << endl; }
void fc() { cout << "hello fc" << endl; }
//定義函數指針,返回類型為void,參數傳遞為void
typedef void (*funcptr)(void);
//在堆區產生二維數組
void new2DArray(int x,int y)
{
int ** p=new int*[y];
for(int i=0;i(pd);
B* pb = dynamic_cast(pd);
cout << (int)(void*)pc << endl;
cout << (int)(void*)pb << endl;
cout << (int)(void*)pc - (int)(void*)pb << endl;//200
//測試獲取數組長度
int p[]={1,2,3,4,5};
printArrLength(p);
//函數指針的測試部分
funcptr fp;
char choosefunc;
cin >> choosefunc;
switch(choosefunc)
{
case 'a':
fp=&fa;
break;
case 'b':
fp=&fb;
break;
case 'c':
fp=fc;
break;
default:
break;
}
//這裡別忘了調用
(*fp)();
//測試二維數組的產生
new2DArray(4,5);
return 0;
}