Вызов суперкласса из подкласса - PullRequest
0 голосов
/ 29 февраля 2012

В следующей ситуации, как я могу сделать так, чтобы я мог вызвать параметризованный конструктор SuperClass из конструктора SubClass?

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 (учитывая, что он абстрактный), или я должен переместить код инициализации члена в отдельную функцию, скажем, init( ... ) в SuperClass? В таком случае, как бы я тогда вызвал эту функцию из SubClass?

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Вызовите конструктор SuperClass в списке инициализаторов SubClass:

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;
};
2 голосов
/ 29 февраля 2012

Инициализация базового класса должна быть сделана так:

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.

1 голос
/ 29 февраля 2012

Я написал ниже код для вызова параметризованного конструктора. всегда лучше делать инициализацию в самом параметризованном конструкторе. Еще одна вещь, которую вы должны иметь в виду, это то, что если ваше наследование является частным, то вы не можете использовать функции 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() { 
            //... 
        };
    };

надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...