2012-02-29 7 views
0

В следующей ситуации, как я могу сделать его таким, чтобы я мог вызвать параметризованный конструктор 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?

+0

Вы имели в виду 'class SubClass: public SuperClass {'? – hmjd

+0

Да, да. Спасибо. – Ben

ответ

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 конструктор в списке инициализаторе 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; 
}; 
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() { 
      //... 
     }; 
    }; 

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

Смежные вопросы