在以下情况中,我如何才能使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 :(得分: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
必须可以看到构造函数:public
或protected
:
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() {
//...
};
};
希望这会对你有所帮助。