2012-07-07 114 views
2

下面是一個面試問題:抽象基類實現

我們怎樣才能實現一個抽象基類不使用純虛函數。 我們可以,因爲在這種情況下這樣做,我們不能創建一個類的任何對象我們可以說我們班是一個抽象基類。

起初我以爲使用虛擬析構函數,但我不確定這個解決方案,因爲虛擬關鍵字。你能幫忙嗎?

+1

在這種情況下,你沒有向面試官詢問* abstract *的含義嗎?我想他應該首先避免使用這個術語。 – Nawaz 2012-07-07 17:39:57

+0

這個「抽象基類」的要求是什麼? – juanchopanza 2012-07-07 17:52:18

+0

那時我以爲不應該創建那個類的成員。 – 2012-07-07 17:54:22

回答

5

您請教兩個問題,我們將依次回答:

我們怎樣才能實現的抽象基類不使用純虛函數?

根據抽象類的定義,它是不可能的:「一個類如果至少有一個純虛函數是抽象的」(C++ 11§10.4/ 2)。因此,爲了是抽象的,一個類必須聲明純虛函數,或者它必須繼承一個來自其派生的類。

我們可以做些什麼以使我們不能創建任何類的對象?

這個問題可以用許多不同的方式解釋,每個方法都有不同的解決方案。

  1. 從字面上看,問題是要求一種沒有實例可能被創建的類型。沒有定義構造函數的類不能構造。

    要做到這一點,應該申報(但沒有定義),默認的構造函數和拷貝構造函數的類。如果一個正在使用與C++ 11的刪除特殊成員函數支持一個編譯器,以刪除它們應被宣佈。

  2. 在第一個問題的背景下,似乎更有可能是定義一個只能被實例化爲另一個類的基類子對象的類。

    這可以通過聲明所有構造爲受保護的,而不是提供用於創建類的實例,並且通過不成爲朋友的任何其他類或功能的任何靜態工廠成員函數來完成。

+0

根據L.ppt對Mahesh的回答的評論,受保護的構造函數對於解決方案2來說是不夠的,因爲任何派生類都可以創建一個基類的獨立實例 - 至少,這聽起來對我來說是正確的,沒有嘗試過它或檢查標準... – 2012-07-08 03:13:00

+1

@TonyDelroy:不,派生類只能使用其「this」指針訪問基類的受保護成員(或者通過形成指向成員的指針,這不適用於此因爲不可能獲得指向構造函數的指針)。它無法訪問任何其他基本類型實例的受保護成員。據我所知,只要所有的構造函數都受到保護,我就沒有看到任何漏洞。我很想看到一個(非病態的)例子,證明我錯了,但:-) – 2012-07-08 05:20:43