2014-05-04 51 views
0

通常在C++中,我們在不同的類中使用相同的參數以及虛擬關鍵字來看到相同的名稱函數。 它是一個多態的例子嗎?如果是,如何以及是否有任何其他方式來理解C++中的多態?在C++中,虛擬函數,函數覆蓋和多態性是相互關聯的嗎?

+1

您是否特別提到了亞型多態性?重載和模板是C++中另外兩個多態的例子。 – rightfold

+1

也許這[鏈接](http://www.cplusplus.com/doc/tutorial/polymorphism/)可以幫助你 –

+0

@rightfold:不,沒有任何特定類型的多態性。我只想知道函數重載或虛函數與polymorohism的關係是什麼?而當你再給出兩個時,我們怎麼能稱之爲多態的重載和模板例子? – Mashuk

回答

1

假設你有以下方案:

class Base { 
    public: 
    virtual int foo() = 0; 
}; 

class Derived1 : public Base { 
    public: 
    virtual int foo() { return 1; } 
}; 

class Derived2 : public Base { 
    public: 
    virtual int foo() { return 2; } 
}; 

現在,讓我們說,要存儲在容器Derived1Derived2對象,可以說一個std::vector以及每次通過矢量迭代要求其每個對象的功能foo。通常,您需要兩個向量,一個用於類Derived1的對象,另一個用於類Derived2的對象。

現在看看多態性是如何來拯救我們的。我們可以將對象Derived1Derived2的地址存儲爲指向Base對象的指針,然後將這些指針存儲在std::vector<Base*> v中。現在,每次我們迭代指針向量並調用成員函數foo(例如,for(auto base : v) base->foo())時,都會爲每個對象調用右函數foo。這是多態性的很多方面之一,它被稱爲upcasting

我希望上面的運行時多態性的例子給了你一個線索,至於如何虛擬函數和函數重寫與繼承和多態性有關。

更新:

模板是編譯時多態的形式來看一看這太問題what is the difference between templates and polymorphism