2012-02-29 69 views
0

在下列情況下,我怎麼可以把它,這樣我可以從​​構造函數中調用SuperClass的參數的構造函數?從子類中調用父類

class SuperClass { 

    int superMember; 

    SuperClass(int superMember) { 
     this->superMember = superMember; 
    }; 

    virtual void doStuff() = 0; 
}; 

class SubClass : public SuperClass { 

    int subMember; 

    SubClass(int superMember, int subMember) { 
     this->subMember = subMember; 
     SuperClass(superMember); 
    }; 

    void doStuff() { 
     //... 
    }; 
}; 

如果有,即使在SuperClass構造函數(因爲它是抽象的),或者我應該移動成員初始化代碼到一個單獨的功能,例如在SuperClassinit(...)?在那種情況下,我將如何從​​內調用此函數?

+0

您是不是要找'類子類:公共父類{'? – hmjd 2012-02-29 14:00:08

+0

是的,我做到了。謝謝。 – Ben 2012-02-29 15:41:01

回答

2

基類的初始化應該做的那樣:

SubClass(int superMember, int subMember) : SuperClass(superMember) { 
     this->subMember = subMember;  
    } 

你甚至使用成員的初始化列表太

SubClass(int superMember, int subMember_) : 
    SuperClass(superMember), subMember(subMember_){} 

(注意你}後不需要分號)

但在此之前,您需要繼承Superclass那樣

class SubClass : public SuperClass {/*...*/} 

(如果我理解你的意圖右)

之後,你需要指定的訪問級別的方法和構造,我相信他們應該是public

2

調用SuperClass構造中的​​初始化列表:

class SubClass : public SuperClass { 
    int subMember; 

// Made constructor 'public'. 
public: 
    SubClass(int a_superMember, int a_subMember) : SuperClass(a_superMember), 
                subMember(a_subMember) {} 
}; 

即使SuperClass是抽象的,我們仍然需要構造,在這種情況下初始化superMember

SuperClass構造函數必須是可見的​​:要麼publicprotected

class SuperClass { 

    int superMember; 

public: // or protected: 
    SuperClass(int superMember) { 
     this->superMember = superMember; 
    }; 

    virtual void doStuff() = 0; 
}; 
1

我寫了下面的代碼來調用參數的構造函數。 在參數化構造函數本身中進行初始化總是更好。 一個你應該記住的還有一點是,如果你繼承的私人那麼你就不能使用init()函數。

class SuperClass { 

     int superMember; 

     SuperClass(int superMember) { 
      this->superMember = superMember; 
     }; 

     virtual void doStuff() = 0; 
    }; 

    class SubClass :public/private/protected SuperClass 

{

 int subMember; 

     SubClass(int superMember, int subMember) :superClass(superMember) 

{ 這 - >亞段=亞段;

 }; 

     void doStuff() { 
      //... 
     }; 
    }; 

希望這會幫助你。