通常在C++中,我們在不同的類中使用相同的參數以及虛擬關鍵字來看到相同的名稱函數。 它是一個多態的例子嗎?如果是,如何以及是否有任何其他方式來理解C++中的多態?在C++中,虛擬函數,函數覆蓋和多態性是相互關聯的嗎?
0
A
回答
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; }
};
現在,讓我們說,要存儲在容器Derived1
和Derived2
對象,可以說一個std::vector
以及每次通過矢量迭代要求其每個對象的功能foo
。通常,您需要兩個向量,一個用於類Derived1
的對象,另一個用於類Derived2
的對象。
現在看看多態性是如何來拯救我們的。我們可以將對象Derived1
和Derived2
的地址存儲爲指向Base
對象的指針,然後將這些指針存儲在std::vector<Base*> v
中。現在,每次我們迭代指針向量並調用成員函數foo
(例如,for(auto base : v) base->foo()
)時,都會爲每個對象調用右函數foo
。這是多態性的很多方面之一,它被稱爲upcasting
我希望上面的運行時多態性的例子給了你一個線索,至於如何虛擬函數和函數重寫與繼承和多態性有關。
更新:
模板是編譯時多態的形式來看一看這太問題what is the difference between templates and polymorphism。
相關問題
- 1. 虛擬函數可以被非虛函數覆蓋嗎?
- 2. 以相互排斥的方式覆蓋虛擬函數
- 3. 在C++中,如果覆蓋虛擬函數,它是一個自動虛擬的函數嗎?
- 4. C# - 爲什麼虛擬函數不能覆蓋抽象函數?
- 5. 虛擬函數是否覆蓋基類中同名的非虛函數?
- 6. C++虛擬關鍵字vs覆蓋函數
- 7. 在C++中的函數覆蓋沒有'虛擬'
- 8. 覆蓋虛擬成員函數時,爲什麼覆蓋函數總是變爲虛擬的?
- 9. C++成員函數的虛擬覆蓋和過載,同時
- 10. 使用C++中的私有函數覆蓋公共虛函數
- 11. 覆蓋上非虛函數
- 12. 顯式覆蓋虛函數
- 13. 安全地覆蓋C++虛函數
- 14. 覆蓋C++中的函數
- 15. 虛擬函數C++
- 16. 虛擬函數C#
- 17. 強制調用虛擬基本函數而不是被覆蓋的函數
- 18. C++多態/純虛函數
- 19. 多態只是覆蓋繼承類的函數嗎?
- 20. C#覆蓋虛擬函數,而不必實現另一個類
- 21. 要求虛函數覆蓋以使用覆蓋關鍵字
- 22. C++多態性和覆蓋
- 23. 覆蓋代碼體中的虛函數
- 24. 多態性和純虛函數
- 25. C++用函數指針覆蓋純虛函數
- 26. Excel:將兩個函數相互關聯
- 27. 在C#中,每個抽象函數都是虛擬的嗎?
- 28. 我可以在覆蓋虛擬函數的返回類型中丟失「const」嗎?
- 29. 「C#基類虛函數」 - 「在託管C++ ref類中覆蓋」
- 30. 在C++中,構造函數和析構函數可以是內聯函數嗎?
您是否特別提到了亞型多態性?重載和模板是C++中另外兩個多態的例子。 – rightfold
也許這[鏈接](http://www.cplusplus.com/doc/tutorial/polymorphism/)可以幫助你 –
@rightfold:不,沒有任何特定類型的多態性。我只想知道函數重載或虛函數與polymorohism的關係是什麼?而當你再給出兩個時,我們怎麼能稱之爲多態的重載和模板例子? – Mashuk