从子类内部调用超类

时间:2012-02-29 13:55:49

标签: c++ inheritance virtual abstract-class

在以下情况中,我如何才能使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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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必须可以看到构造函数:publicprotected

class SuperClass {

    int superMember;

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

    virtual void doStuff() = 0;
};

答案 2 :(得分: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)

{                 this-> subMember = subMember;

        };

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

希望这会对你有所帮助。