這支程式是我在講授 C++ 課程時,先搭配講義,說明理論後,在課堂上所實作CODING完成的,整支程式碼,由無到有一行一行撰寫完成,在撰寫的同時一定會講解理論與技巧,讓我這一班的學生都能全聽懂。完成後,我認為此支程式具有一些 C&C++ 程式碼技巧,遂貼上 BLOG 與各位同好分享。
這一小段程式碼以 C++ 的多型技巧為基礎,程式中 Shape 指標物件呼叫 draw 函數,此 draw函數 可以傳入不同形式(種類)參數。 這您有看懂嗎?^^
/*
* C&C++ Test code
* Copyright (C) 2009 Yi-Hua, Chiang
* microcyh@seed.net.tw
*/
#include <stdio.h>
#include <stdlib.h>
struct ReData
{
int l;
int w;
int Area;
};
class Shape
{
public:
virtual void draw( void *p ){}
void callDraw(void *p){ draw(p); }
};
class TextDraw : public Shape
{
public:
void draw(void *p)
{
char **pArr = (char **)p;
printf( "%s\r\n", *pArr ); pArr = pArr+1;
printf( "%s\r\n", *pArr ); pArr = pArr+1;
printf( "%s\r\n", *pArr );
printf( "class TextDraw:void draw() O\r\n" );
}
};
class Rectangle : public Shape
{
public:
void draw(void *p)
{
struct ReData *RD;
RD = (struct ReData *)p;
RD->l =10;
RD->w =20;
RD->Area =RD->l * RD->w;
printf( "class Rectangle:void draw() 口 RD->Area=%d\r\n" , RD->Area );
}
};
void PolyFun1()
{
printf( "void PolyFun1()\r\n" );
}
class PolyShape : public Shape
{
public:
void draw(void *p)
{
void (*ShapeFun)();
ShapeFun = (void (*)())p;
(*ShapeFun)();
printf( "class PolyShape:draw PolyShape\r\n" );
}
};
int main()
{
char *arr[3] = {"Hello", "CYH", "III"};
TextDraw TDO1; Rectangle RO1; PolyShape PSO1;
struct ReData SRD1;
Shape* pO1;
printf( "======pO1 = &PSO1;============\r\n" );
pO1 = &PSO1; pO1->draw( (void*)PolyFun1 );
pO1->callDraw( (void*)PolyFun1 );
printf( "\n======pO1 = &RO1;============\r\n" );
pO1 = &RO1; pO1->draw( (void*)&SRD1 );
printf( "\n======pO1 = &TDO1;============\r\n" );
pO1 = &TDO1; pO1->draw( (void*)arr );
system( "PAUSE" );
return 0;
}
此程式執行結果:
沒有留言:
張貼留言