2012-02-21 69 views
2

我有兩個子類從同一個抽象超類繼承而來。對所有依賴於幾個屬性的子類都有一個共同的操作。讓我用一個例子解釋:構造調用順序(C++)

之所以這樣說,是超A(A是抽象的):

class superClass 
{ 
    int valueA; 
    int valueB; 
    float* array; 

    public superClass(){ 
     array[valueA + valueB] 
    } 

    virtual foo(){ 
    } 

} 

而這些是我的子類:

class firstSubClass: superClass 
{ 

    public firstSubClass():superClass(), valueA(100),valueB(2){ 
    } 

    foo(){ 
    } 

} 

class secondSubClass: superClass 
{ 

    public secondSubClass():superClass(), valueA(50),valueB(3){ 
    } 

    foo(){ 
    } 

} 

將數組初始化正確?這意味着,是在superClass之前調用的子類構造函數還是其他方式?

有沒有辦法使兩個子類通用的初始化行爲通過將其放入超類?

在此先感謝。

回答

4

首先調用superClass構造函數。

superClass構造應負責初始化superClass's數據成員 和firstSubClass應該初始化自己的數據成員,並調用superClass's構造;

構造函數的調用順序here的更多信息,你可能還需要閱讀有關構造函數初始化列表here

所以,我會定義superClassfirstSubClasssecondSubClass爲:

class superClass 
{ 
    int valueA; 
    int valueB; 
    float* array; 

    public: 

    superClass(int a , int b): valueA(a),valueB(b) { 

     array = new float[valueA + valueB]; 
    } 
    virtual foo(){ 
    } 

} 



class firstSubClass: public superClass 
{ 

    public: 

    firstSubClass():superClass(100,2){ //calls superclass's constructor 
    } 

    foo(){ 
    } 

} 

class secondSubClass: public superClass 
{ 

    public : 

    secondSubClass():superClass(50 , 3){ 
    } 

    foo(){ 
    } 

} 
+0

這很有意義。我認爲這是你感到尷尬不想自己想出來的情況之一。謝謝! – 2012-02-21 11:42:40

+0

@ kelmer,很高興幫助。如果你喜歡上面的帖子,請把它標記爲答案:P。 – fizzbuzz 2012-02-21 11:49:00

+0

完成,對不起,錯過了:) – 2012-02-21 11:59:19

1

如果我的理解好吧,你希望超類在你構造任何子類時創建(不僅僅是初始化)一個浮點數組。當創建繼承的類的實例,基類構造函數被調用首先,你需要傳遞值a和valueB價值觀 - 你需要將它們添加構造函數的參數:

superClass::superClass(int valueA, int valueB) : 
    valueA(valueA), valueB(valueB), array(0) 
{ 
    // now create an array of requested length - allocate memory for it 
    array = new float[valueA + valueB]; 
} 

// don't forget to deallocate memory for it (possibly in destructor) 
superClass::~superClass() 
{ 
    delete[] array; 
    array = 0; 
} 

然後,當你創建的繼承實例類,您可以提供值a和valueB作爲父類的構造參數:

firstSubClass::firstSubClass() : superClass(100, 2) 
{ 
    //... 
} 

這是不使用硬編碼值(神奇數字),所以它會更好,值a和valueB添加爲子類的構造函數的參數很好的做法:

firstSubClass::firstSubClass(int valueA, int valueB) : superClass(valueA, valueB) 
{ 
    //... 
} 

最後,你應該避免數組。這是C++,使用std::vector<float>,它更安全,更易於使用!

+0

真的嗎?我一直認爲陣列比矢量陣列更快,效率更高... – 2012-02-21 12:00:19

+1

@kelmer - 矢量只是簡單地包裝數組,它們讓事情變得更簡單,但效率可能不大。 – 2012-02-21 12:09:11

+1

@kelmer與可能存在錯誤且難以維護的陣列的高級別錯誤相比,性能差異並不存在。 – 2012-02-21 12:10:02