簡體   English   中英

從子類內部調用超類

[英]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可見: publicprotected

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM