20-多型

東閣堂主發表於2019-03-14

寫在前面

終於到了物件導向的最後一個特性--多型
複製程式碼

名詞解釋

這個名詞也是老生常談了
多型(Polymorphism)按字面的意思就是“多種狀態”。
在面嚮物件語言中,介面的多種不同的實現方式即為多型。
引用Charlie Calverts對多型的描述——多型性是允許你將父物件設定成為一個或更多的他的子物件相等的技術,
賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作(摘自“Delphi4 程式設計技術內幕”)。
簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。
多型性在Object Pascal和C++中都是通過虛擬函式實現的
這裡出現了一個新的概念--虛擬函式
就是被關鍵字visual修飾的函式,下篇詳細介紹
複製程式碼

碼上建功

class Animal {
public:
    virtual void run() {
        cout << "Animal::run()" << endl;
    }
};

class Cat : public Animal {
public:
    void run() {
        cout << "Cat::run()" << endl;
    }
};

class Dog : public Animal {
public:
    void run() {
        cout << "Dog::run()" << endl;
    }
};

class Pig : public Animal {
public:
    void run() {
        cout << "Pig::run()" << endl;
    }
};

int main() {

    Animal *pig = new Pig();
    pig->run();
    delete pig;
    
    Animal *dog = new Dog();
    dog->run();
    delete dog;
    
    getchar();
    return 0;
}
看下列印結果:
Pig::run()
Dog::run()

如果沒有加入visual關鍵字修飾,則不會實現多型
列印結果
Animal::run()
Animal::run()
 
複製程式碼

裝逼一下

◼ 預設情況下,編譯器只會根據指標型別呼叫對應的函式,不存在多型
◼ 多型是物件導向非常重要的一個特性 
同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果 
在執行時,可以識別出真正的物件型別,呼叫對應子類中的函式
◼ 多型的要素 
子類重寫父類的成員函式(override) 
父類指標指向子類物件 
利用父類指標呼叫重寫的成員函式
 
複製程式碼

完整程式碼demo,請移步GitHub:DDGLearningCpp

相關文章