2012-09-14 58 views
1

我正在使用一個類,說baseClass,從中我派生另一個類derivedClass。我有一個問題定義,除了別人之外說:繼承 - C++

i)成員 - 對象初始化程序應該用於初始化數據成員,說var1,在基類中聲明。

ii)i)在基類構造函數內完成。它說,這隻能通過派生類的構造函數來調用。

iii)基類是一個抽象類,其對象不能被創建。但是,我有第三類,其中,我使用:

baseClass *baseObjects[5]; 

編譯器不報告錯誤。

不明白,我)和ii)的真正意思。用簡單的話來解釋會很好。另外,對iii)的任何幫助都是值得歡迎的。

+2

也許你需要一本C++書籍或一個類?因爲'super'不是C++關鍵字,所以這是一個Java事物。 –

+0

Err。我的意思是與super()相關的東西。即使用派生的構造函數,它也將適當的值傳遞給基類構造函數。 –

回答

2

我想一個例子會是最好的。

ⅰ)

class A 
{ 
    int i; 
public: 
    A(int ii) : i(ii) {} 
} 

的部分i(ii)是一個構件的一個例子 - 對象初始化劑。由於C++保證所有構造函數的構造函數在輸入構造函數體之前被調用,所以這是指定爲每個成員調用哪個構造函數的唯一方法。

ii)在C++中沒有super關鍵字。你必須這樣指定基類:

class B : public A 
{ 
public: 
    B(int i) : A(i) {} 
} 

這部分是由於C++允許多重繼承的原因。 iii)請注意,您尚未創建任何對象,只有指向對象的指針。通過這種方法,通過繼承的多態性可以在C++中實現。

2
#include <iostream> 

class Base 
{ 
public: 
    Base(int i) 
    {} 

    virtual ~Base() = 0 
    {} 

protected: 
    int i_; 
}; 

class Derived: public Base 
{ 
public: 
    Derived(int i, int j) : Base(i), j_(j) 
    {} 

private: 
    int j_; 
}; 

int main(int argc, char* argv[]) 
{ 
    //Base b(1); object of abstract class is not allowed 
    Derived d(1, 2); // this is fine 
} 

正如你所看到的,i_被Derived類通過調用Base類的構造函數初始化。析構函數上的= 0確保Base類是純虛擬的,因此我們不能實例化它(參見主註釋)。

2

i)以下是已知的初始化程序列表,您可以使用初始化程序列表確保數據成員在輸入構造函數之前具有值。因此,在下面的示例中,在輸入構造函數之前,a的值爲10。

Class baseClass 
{ 
    int a; 
public: 
    baseClass(int x):a(x) 
    { 
    } 
} 

ii)這是如何從派生類構造函數顯式調用基類構造函數。

Class derivedClass : public baseClass 
{ 
    int a; 
public: 
    derivedClass(int x):baseClass(x) 
    { 
    } 
} 

iii)您不能直接創建抽象類的實例。但是,您可以創建指向抽象基類的指針,並將這些指針指向其任何具體實現。因此,如果您有一個抽象基類Bird和具體實現ParrotSparrow那麼Bird* bird可能會指向ParrotSparrow實例,因爲它們都是鳥類。