[英]Calling superclass from within subclass
在以下情況下,如何使它可以從SubClass
的構造函數中調用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
甚至應該有一個構造SuperClass
(考慮到它是抽象的),還是應該將成員初始化代碼移到一個單獨的函數中,比如說在SuperClass
init( ... )
? 在那種情況下,我該如何在SubClass
調用此函數?
基類的初始化應像這樣完成:
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
。
在SubClass
的初始化列表中調用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
,構造函數必須對SubClass
可見: public
或protected
:
class SuperClass {
int superMember;
public: // or protected:
SuperClass( int superMember ) {
this->superMember = superMember;
};
virtual void doStuff() = 0;
};
我已經在代碼下方編寫了調用參數化構造函數的代碼。 總是最好在參數化構造函數本身中進行初始化。 您應該記住的另一件事是,如果繼承是私有的,那么您將無法使用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)
{this-> subMember = subMember;
};
void doStuff() {
//...
};
};
希望這會幫助你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.