2012-04-03 96 views
6

基本的c + +问题我很确定。如果我有一个带有不带参数的构造函数的基类,并且只是初始化了一些受保护的成员,那么派生类是否立即调用这个基构造函数,如果它与参数相匹配的话(如意,但不可能)有办法迫使它从派生类自动调用基础构造函数,而无需在派生类中明确告诉它这么做?我问,因为我正在写各种包装,有一些保护成员,我想初始化为特定的值,然后我想派生和操作这个基类,以满足我的需求,但我不喜欢外部用户必须记住显式调用基础构造函数或在它们自己的构造函数中设置这些值。如何强制在派生类中调用基类构造函数?

+1

我有点迷失于你的问题的措辞,但如果基类有一个默认的/无参数的构造函数,它将被调用时如果未明确指定基类的初始化,则初始化派生类对象。 – birryree 2012-04-03 21:20:37

回答

8

是的,默认的基础构造函数总是被调用,除非另有明确说明。

例如:

class A 
{ 
public: 
    A() { std::cout << "A"; } 
}; 

class B : A 
{ 
public: 
    B() {} 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

将输出:

A 

通过 “明确规定,否则” 我的意思是,你可以在派生类中调用不同的构造函数:

class A 
{ 
public: 
    A() { std::cout << "A"; } 
    A(int) { std::cout << "AAA"; } 
}; 

class B : A 
{ 
public: 
    B() : A(1) {} //call A(int) 
}; 

int main() 
{ 
    B b; 
    return 0; 
} 

将输出

AAA 

重要,如果你没有一个默认的构造函数(声明了一个非默认的构造函数,而不是默认的一个)或默认的构造函数是不可见的(标记为private),你需要显式调用派生类中的可用构造函数。

+0

假设唯一的构造函数类A有一个整数作为参数,然后派生类有一个构造函数,它也接收一个int。基础构造函数会被偶然调用吗?或者是一个构造函数,如果它没有参数,那么它只被认为是默 – FatalCatharsis 2012-04-03 22:40:02

+0

也是,最后的想法,如果它反之亦然,你在B中定义了一个带有参数的构造函数,而在A中定义了一个无参数构造函数,A的构造函数会被调用吗?也称为first,基类的默认构造函数或派生类的默认构造函数。 – FatalCatharsis 2012-04-03 22:59:13

2

如果您的基类有一个“默认构造函数”(一个不带参数的构造函数;由您明确提供,或由编译器隐式提供,因为您没有明确提供任何构造函数)类构造函数会自动调用它,除非您指定他们调用不同的构造函数。 (如果你的基类不是有一个“默认构造函数”,因为你提供了一个或多个带参数的构造函数,没有不带构造函数的构造函数,那么它是一个编译错误派生类的构造函数不能指出它所调用的基类构造函数)

相关问题