# 類別和繼承程式語言的問題

### 5 個解答

• 卸貨
Lv 5
7 年前
最佳解答

用 C 嗎？可以呀，只怕你看不懂！

static const float PI = 3.14159265;

/* Shape */

typedef struct shape_t;

typedef float (*circumference_t)(const struct shape_t *obj);

typedef float (*area_t)(const struct shape_t *obj);

typedef struct shape_t

{

circumference_t circumference;

area_t area;

} shape_t;

/* Circle */

typedef struct circle_t

{

shape_t base;

float diameter;

} circle_t;

float circle_circumference(const circle_t *obj)

{

return PI * obj->diameter;

}

float circle_area(const circle_t *obj)

{

return 0.25 * PI * obj->diameter * obj->diameter;

}

void circle_init(circle_t *obj, float diameter)

{

obj->base.circumference = circle_circumference;

obj->base.area = circle_area;

obj->diameter = meter;

}

/* Rectangle */

typedef struct rectangle_t

{

shape_t base;

float width;

float height;

} rectangle_t;

float rectangle_circumference(const rectangle_t *obj)

{

return 2*( obj->width + obj->height );

}

float rectangle_area(const rectangle_t *obj)

{

return obj->width * obj->height;

}

void rectangle_init(rectangle_t *obj, float width, float height)

{

obj->base.circumference = rectangle_circumference;

obj->base.area = rectangle_area;

obj->width = width;

obj->height = height;

}

/* Example to use */

#include < stdio.h >

void main(void)

{

shape_t circle, rectangle;

circle_init(&circle, 7);

rectangle_init(&rectangle, 3, 5);

printf("circle diameter = %f\n", circle.diameter);

printf("circle circumference = %f\n", circle.circumference(&circle));

printf("circle area = %f\n", circle.area(&circle));

printf("rectangle width = %d\n", rectangle.width);

printf("rectangle height = %d\n", rectangle.height);

printf("rectangle circumference = %f\n", rectangle.circumference(&rectangle));

printf("rectangle area = %f\n", rectangle.area(&rectangle));

return 0;

}

2013-12-06 15:32:44 補充：

不好意思，大概一陣子沒寫程式了，上面的程式碼是有大問題的，雖然有表達到我要表達的東西。我把重新寫過測試過的程式碼重新貼上，但因為字數很多，所以慢慢貼，真貼不完的話我就寄到版主信箱。

2013-12-06 15:33:05 補充：

#include

#include

static const float PI = 3.14159265;

/* Shape */

struct shape_t;

typedef void (*release_fn) (const struct shape_t *obj);

typedef float (*circumference_fn)(const struct shape_t *obj);

typedef float (*area_fn) (const struct shape_t *obj);

2013-12-06 15:33:52 補充：

typedef struct shape_t

{

release_fn release;

circumference_fn circumference;

area_fn area;

} shape_t;

/* Circle */

typedef struct circle_t

{

shape_t base;

float diameter;

} circle_t;

2013-12-06 15:34:16 補充：

float circle_circumference(const circle_t *obj)

{

return PI * obj->diameter;

}

float circle_area(const circle_t *obj)

{

return 0.25 * PI * obj->diameter * obj->diameter;

}

void circle_release(circle_t *obj)

{

free(obj);

}

2013-12-06 15:34:45 補充：

shape_t* circle_create(float diameter)

{

circle_t *obj = malloc(sizeof(circle_t));

obj->base.release = (release_fn) circle_release;

obj->base.circumference = (circumference_fn) circle_circumference;

obj->base.area = (area_fn) circle_area;

2013-12-06 15:35:09 補充：

obj->diameter = diameter;

return (shape_t*)obj;

}

/* Rectangle */

typedef struct rectangle_t

{

shape_t base;

float width;

float height;

} rectangle_t;

float rectangle_circumference(const rectangle_t *obj)

{

return 2*( obj->width + obj->height );

}

2013-12-06 15:35:34 補充：

float rectangle_area(const rectangle_t *obj)

{

return obj->width * obj->height;

}

void rectangle_release(rectangle_t *obj)

{

free(obj);

}

shape_t* rectangle_create(float width, float height)

{

rectangle_t *obj = malloc(sizeof(rectangle_t));

2013-12-06 15:36:23 補充：

obj->base.release = (release_fn) rectangle_release;

obj->base.circumference = (circumference_fn) rectangle_circumference;

obj->base.area = (area_fn) rectangle_area;

obj->width = width;

obj->height = height;

return (shape_t*)obj;

}

2013-12-06 15:36:59 補充：

/* Example to use */

int main(void)

{

shape_t *circle = circle_create(7);

shape_t *rectangle = rectangle_create(3,5);

printf("circle circumference = %f\n", circle->circumference(circle));

printf("circle area = %f\n", circle->area(circle));

2013-12-06 15:37:25 補充：

printf("rectangle circumference = %f\n", rectangle->circumference(rectangle));

printf("rectangle area = %f\n", rectangle->area(rectangle));

circle->release(circle);

rectangle->release(rectangle);

return 0;

}

2013-12-07 00:15:59 補充：

其實版主的發問也很矛盾，一開始說「請用 C++ 撰寫...」，最後又說「這題可以用 C 來寫嗎？」

• 匿名使用者
7 年前

台灣首家合法娛樂城開幕囉!

體育博彩、真人對戰、現場遊戲、彩球

投注高賠率，歡迎您來體驗!

官方網站 aa777.net

2013-12-18 18:09:48 補充：

台灣首家合法娛樂城開幕囉!

體育博彩、真人對戰、現場遊戲、彩球

投注高賠率，歡迎您來體驗!

官方網站 aa777.net

• Tai
Lv 5
7 年前

版主這是 C++ 題目, 就是要你練習 C++ 抽象類別（abstract class），衍生類別（derived class），介面（interface），你不能用 C 撰寫，這是兩碼子事情。

UFO 兄辛苦了，但不對題，也可以說是被版主誤導了。

• 阿明
Lv 5
7 年前

有學過C語言嗎？ C語言只有結構， 沒有這些東東 ， 類別（class）， 抽象類別（abstract class）， 衍生類別（derived class）這些C++才有，C語言你要怎麼寫

2013-12-06 18:15:10 補充：

A TK UE 2AEO OR UFO 大大 很熱心幫他寫，沒錯C++的類別（class）是由C語言的 結構struct演化的，你沒看清楚，版主是要C++撰寫三個類別，都繼承抽象的形狀類別，寫這程式目的，應該是學校要他們瞭解C++各種類別繼承的關係及衍生類別型態，跟你用C語言的struct還是有差異，你沒等版主說清楚，不曉得他能不用

• 您覺得這個回答如何？您可以登入為回答投票。
• 7 年前

題目都已經叫你"請使用C++撰寫".