我知道這個話題有很多問題。但是,我無法理解使用抽象類而不是虛擬類的確切需要。如果我沒有弄錯,抽象類也隱含地是一個虛擬類,它們之間的唯一區別是抽象方法必須在子類中重寫。那麼,爲什麼虛擬課堂不夠?在哪些情況下,我們確實需要抽象類而不是虛擬類?爲什麼我們需要抽象類而不是虛擬類?
回答
首先,沒有「虛擬課堂」這樣的東西。我假設你打算說一個多態類(至少有一個虛擬成員函數,當然是一個虛擬析構函數)。
抽象類(至少具有一個純虛擬成員函數)沒有「需要」,但它們有助於創建不能實例化的接口,但僅提供一組可覆蓋的成員函數。它允許你提供一個通用的基類來協助多態,在這種情況下實例化這樣一個普通的基類不會有任何用處,或者會違背設計者的意圖。
/**
* Instantiating `IType` cannot serve a purpose; it has
* no implementation (although I _can_ provide one for `foo`).
*
* Therefore, it is "abstract" to enforce this.
*/
struct IType
{
virtual void foo() = 0;
virtual ~IType() {}
};
/**
* A useful type conforming to the `IType` interface, so that
* I may store it behind an `IType*` and gain polymorphism with
* `TypeB`.
*/
struct TypeA : IType
{
virtual void foo() override {}
};
/**
* A useful type conforming to the `IType` interface, so that
* I may store it behind an `IType*` and gain polymorphism with
* `TypeA`.
*/
struct TypeB : IType
{
virtual void foo() override {}
};
應該指出的是'IType'必須將其析構函數聲明爲'virtual'。 – Nawaz 2014-10-30 13:34:52
@Nawaz:哦,是的,謝謝。也用於編輯。 – 2014-10-30 13:39:36
純虛函數有一些「需求」:實現基類函數可能不太實際。例如,如果它返回的類型不能在沒有對基類不可用的資源的情況下實例化。 – 2014-10-30 13:51:06
- 1. 爲什麼抽象派生類需要初始化一個虛擬基類?
- 2. 爲什麼我們在上課時需要抽象類?
- 3. 爲什麼我們在抽象類存在時需要接口?
- 4. 爲什麼我們有抽象類時需要接口?
- 5. 爲什麼我們需要Java中的抽象類?
- 6. 爲什麼我們需要C++中的抽象類?
- 7. 爲什麼需要抽象類?
- 8. 爲什麼需要抽象類?
- 9. 爲什麼你需要知道抽象類的抽象方法是否抽象
- 10. 爲什麼我們不能在WCF中使用抽象類而不是接口?
- 11. 爲什麼我們需要使用虛擬〜A()= default;而不是在C++ 11中虛擬〜A(){}?
- 12. 爲什麼我們需要包裝類
- 13. 什麼是算法中的抽象數據類型,爲什麼我們需要它們?
- 14. 爲什麼在我們的項目中需要接口層/抽象類?
- 15. 爲什麼HttpServletRequestWrapper類不是抽象的
- 16. 爲什麼我們需要虛擬內存?
- 17. 爲什麼我們需要虛擬桌面?
- 18. 使用虛擬類型(抽象類型)
- 19. 爲什麼HttpContext是一個抽象類而不是接口?
- 20. 爲什麼IDisposable是一個接口,而不是抽象類?
- 21. 爲什麼java.sql.Statement是一個接口而不是抽象類?
- 22. 從抽象類和具體類繼承有什麼區別?爲什麼我們需要後者?
- 23. 爲什麼我們需要鍵入 '( 「+ I +」)',而不僅僅是 '(我)'
- 24. C#設計:爲什麼抽象方法需要new/override而不是虛擬方法?
- 25. 爲什麼我們要使用抽象類或方法,爲什麼不重寫超類方法呢?
- 26. 使用分部類而不是抽象類有什麼好處?
- 27. 爲什麼我的子類被認爲是一個抽象類?
- 28. 爲什麼任何一種抽象都使用接口而不是抽象類?
- 29. 什麼是抽象類型?
- 30. 爲什麼我們需要調用thread.start()而不是thread.run()?
沒有「需要」。你爲什麼這麼認爲? – 2014-10-30 13:15:29
沒有「虛擬課堂」這樣的東西。所以答案是我們需要一個,因爲另一個不存在。 – 2014-10-30 13:15:31
@KerrekSB那麼什麼是「虛擬基類」呢?對不起,如果我混淆的概念。 – zretscen 2014-10-30 13:30:23