(1)struct實現class
struct內部變數等效於class成員變數;
struct內建函式指標等效於class成員函數;
typedef struct point_t
{
int x;
int y;
void (*setPoint)(struct point_t *pP,int x, int y);//傳遞point_t指標參數,以確定被操作對象
} point_t;
void setPoint(struct point_t *pP,int x, int y)
{
pP->x = x;
pP->y = y;
}
void main()
{
struct point_t m_p=
{//可亂序初始化風格
.x=0,
.y=0,
.setPoint=setPoint//初始化函數指標
};
m_p.setPoint(&m_p,10,10);
printf("x=%d,y=%d\n",m_p.x,m_p.y);
}
(2)將struct A作為struct B第一個元素,可實現“繼承”以及“父子”間的強制轉換
typedef struct point_display_t
{
point_t p;//“繼承”
void (*displayPoint)(struct point_display_t *pDis);//傳遞point_display_t 指標參數,以確定被操作對象
} point_display_t;
void displayPoint(struct point_display_t *pDis)
{
printf("x=%d,y=%d\n",pDis->p.x,pDis->p.y);
}
//接(1)
void main()
{
struct point_t m_p=
{
.x=0,
.y=0,
.setPoint=setPoint//初始化函數指標
};
struct point_display_t m_dis=
{
.p=m_p,//複製
.displayPoint=displayPoint
};
m_p.setPoint(&m_p,10,10);
m_dis.displayPoint(&m_dis);//輸出x=0,y=0
struct point_t *p_point;
struct point_display_t *p_point_display;
m_dis.p.setPoint(&(m_dis.p),20,20);
m_dis.displayPoint(&m_dis);//輸出x=20,y=20
p_point=(point_t *)&m_dis;//子類型轉為父類型
printf("x=%d,y=%d\n",p_point->x,p_point->y);//輸出x=20,y=20
p_point_display = (point_display_t *)p_point;
p_point_display->displayPoint(p_point_display);//輸出x=20,y=20
}
ps:指標強制轉換其實就是記憶體位址的直接賦值,然後根據強制轉換後的類型特有的形式訪問記憶體。只要訪問記憶體的方法正確,則能訪問成功。