Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 1 decade ago

什麼是抽象基礎類別

什麼是抽象基礎類別 (abstract base class) ??

如何實體化抽象基礎類別的虛擬方法 (virtual method)??

可不可以舉例說明在應用程式中,

如何宣告及使用抽象基礎類別的物件指標變數?

謝謝~

2 Answers

Rating
  • Lv 7
    1 decade ago
    Favorite Answer

    什麼是抽象基礎類別 (abstract base class) ?如果說一般的class是個房子的藍圖. 那抽象基礎類別就是建築師在餐巾紙上話的草稿. 草稿可以告訴看的人這房子的大概構造和功能. 但卻不能按照草稿來蓋房子. 藍圖是繼承草稿的構造和功能並仔細的描寫功能如何運行和使用. 有了藍圖就可以蓋房子啦. 在一個好的抽象基礎類別裡只有所謂的抽象基礎類別的虛擬方法和成員變數. 抽象基礎類別只告訴你, 繼承此抽象基礎類別的子類別會有什麼樣的功能讓你使用(成員函式). 也就是說抽象基礎類別寫下大體的定義. 繼承此抽象基礎類別的子類別一定要按照定義做. 其實抽象基礎類別可以講是個光說不做的類別… :)例如class shape{public:    virtual char *getName() = 0;    virtual double getArea() = 0;    virtual double getCircumference() = 0;};shape是代表平面形狀. 但是如果我說我要買一個有形狀的桌子. 你知道我要三角型, 四方型, 還是圓型的桌子?virtual <回傳型態> <函式名> <引數> = 0; 表示此函式是個抽象基礎類別的虛擬方法. 如果所有的成員函式都是虛擬方法那此類別就是pure抽象基礎類別.class triangle : public shape{private:    double base, height;public:    char *getName() { return(“triangle”); }    double getArea() { return(base * height / 2); }    double getCircumference() { … }};class rectangle : public shape{private:    double length, width;public:    char *getName() { return(“rectangle”); }    double getArea() { return(length * width); }    double getCircumference() {return(2*(length+width)); }};如何實體化抽象基礎類別的虛擬方法 (virtual method)?我剛剛宣告了一個繼承shape叫triangle和rectangle的子類別. 在一個繼承抽象基礎類別的子類別裡一定要宣告和寫所有在抽象基礎類別的虛擬方法. 這叫實體化. 也就是說”char *getName() { return(“triangle”); }”把” virtual char *getName() = 0;”這個抽象基礎類別的虛擬方法給實體化了. 有了triangle和rectangle之後, 我們可以用來宣告實體啦 有了triangle和rectangle這兩個繼承shape(抽象基礎類別)的子類別. 我們就可以只用shape的指標來運作於triangle和rectangle之間而不被一般類別所限制到.可不可以舉例說明在應用程式中, 如何宣告及使用抽象基礎類別的物件指標變數?以下例子是宣告有20個shape指標的陣列. 在20個shape指標的陣列裡, 偶數的指標指向rectangle. 奇數偶數的指標指向triangle. 你可以看到. 除了在用new宣告triangle和rectangle的實體時才用到triangle和rectangle. 其它的時候不管實體是triangle還是rectangle, 我們都是用shape的指標來運作. 且0錯誤. 這就叫做Polymorphism. #include <iostream>using namespace std;class shape{public:    virtual char *getName() = 0;    virtual double getArea() = 0;    virtual double getCircumference() = 0;};class triangle : public shape{private:    double base, height;public:    triangle(double b, double h) : base(b), height(h) {};    char *getName() { return("triangle"); };    double getArea() { return(base * height / 2); };    double getCircumference() {};};class rectangle : public shape{private:    double length, width;public:    rectangle(double l, double w) : length(l), width(w) {};    char *getName() { return("rectangle"); }    double getArea() { return(length * width); }    double getCircumference() {return(2*(length+width)); }};int main(){    shape *s[20];    int i;        for (i = 0; i < 20; i++)        if (i % 2)            s[i] = new triangle(i, 2*i);        else            s[i] = new rectangle(i, 2*i);                for (i = 0; i < 20; i++)    {        cout << i << " " << s[i]->getName() << endl;        cout << "\tarea : " << s[i]->getArea() << endl << endl;    }    system("pause");    return(0);}懂嗎?不懂請再問

    2005-06-14 03:37:18 補充:

    不用客氣,你懂就好.

    Source(s): Myself
  • 1 decade ago

    龍大 我覺得您好適合當老師 ^.^ ,您的解說都蠻淺顯易懂的,真的

Still have questions? Get your answers by asking now.