2012-02-29 70 views
0

在下列情况下,我怎么可以把它,这样我可以从​​构造函数中调用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构造函数(因为它是抽象的),或者我应该移动成员初始化代码到一个单独的功能,例如在SuperClassinit(...)?在那种情况下,我将如何从​​内调用此函数?

+0

您是不是要找'类子类:公共父类{'? – hmjd 2012-02-29 14:00:08

+0

是的,我做到了。谢谢。 – Ben 2012-02-29 15:41:01

回答

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构造中的​​初始化列表:

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构造函数必须是可见的​​:要么publicprotected

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() { 
      //... 
     }; 
    }; 

希望这会帮助你。