2014-10-30 166 views
3

我知道這個話題有很多問題。但是,我無法理解使用抽象類而不是虛擬類的確切需要。如果我沒有弄錯,抽象類也隱含地是一個虛擬類,它們之間的唯一區別是抽象方法必須在子類中重寫。那麼,爲什麼虛擬課堂不夠?在哪些情況下,我們確實需要抽象類而不是虛擬類?爲什麼我們需要抽象類而不是虛擬類?

+0

沒有「需要」。你爲什麼這麼認爲? – 2014-10-30 13:15:29

+9

沒有「虛擬課堂」這樣的東西。所以答案是我們需要一個,因爲另一個不存在。 – 2014-10-30 13:15:31

+1

@KerrekSB那麼什麼是「虛擬基類」呢?對不起,如果我混淆的概念。 – zretscen 2014-10-30 13:30:23

回答

6

首先,沒有「虛擬課堂」這樣的東西。我假設你打算說一個多態類(至少有一個虛擬成員函數,當然是一個虛擬析構函數)。

抽象類(至少具有一個純虛擬成員函數)沒有「需要」,但它們有助於創建不能實例化的接口,但僅提供一組可覆蓋的成員函數。它允許你提供一個通用的基類來協助多態,在這種情況下實例化這樣一個普通的基類不會有任何用處,或者會違背設計者的意圖。

/** 
* 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 {} 
}; 
+0

應該指出的是'IType'必須將其析構函數聲明爲'virtual'。 – Nawaz 2014-10-30 13:34:52

+0

@Nawaz:哦,是的,謝謝。也用於編輯。 – 2014-10-30 13:39:36

+0

純虛函數有一些「需求」:實現基類函數可能不太實際。例如,如果它返回的類型不能在沒有對基類不可用的資源的情況下實例化。 – 2014-10-30 13:51:06

相關問題