C++ 为什么我的C++;子类需要显式构造函数吗?
我有一个声明和定义构造函数的基类,但由于某些原因,我的公共派生类没有看到该构造函数,因此我必须在派生类中显式声明一个转发构造函数:C++ 为什么我的C++;子类需要显式构造函数吗?,c++,constructor,default,derived-class,C++,Constructor,Default,Derived Class,我有一个声明和定义构造函数的基类,但由于某些原因,我的公共派生类没有看到该构造函数,因此我必须在派生类中显式声明一个转发构造函数: class WireCount0 { protected: int m; public: WireCount0(const int& rhs) { m = rhs; } }; class WireCount1 : public WireCount0 {}; class WireCount2 : public WireCount0 { pu
class WireCount0 {
protected:
int m;
public:
WireCount0(const int& rhs) { m = rhs; }
};
class WireCount1 : public WireCount0 {};
class WireCount2 : public WireCount0 {
public:
WireCount2(const int& rhs) : WireCount0(rhs) {}
};
int dummy(int argc, char* argv[]) {
WireCount0 wireCount0(100);
WireCount1 wireCount1(100);
WireCount2 wireCount2(100);
return 0;
}
在上面的代码中,我的WireCount1 WireCount1(100)
声明被编译器拒绝(“调用'WireCount1::WireCount1(int)'时没有匹配的函数”),而我的wireCount0
和wireCount2
声明则没有问题
我不确定我是否理解为什么需要提供WireCount2
中所示的显式构造函数。是因为编译器为WireCount1
生成了一个默认构造函数,而该构造函数隐藏了WireCount0
构造函数吗
作为参考,编译器是i686-apple-darwin10-gcc-4.2.1(gcc)4.2.1(apple Inc.build 5659)构造函数不是继承的。必须为派生类创建构造函数。此外,派生类的构造函数必须调用基类的构造函数。所有派生类都必须以某种形式调用其基类的构造函数 创建重载构造函数时,默认编译器生成的无参数构造函数将消失,派生类必须调用重载构造函数 当你有这样的东西时:
class Class0 {
}
class Class1 : public Class0 {
}
编译器实际上会生成以下内容:
class Class0 {
public:
Class0(){}
}
class Class1 : public Class0 {
Class1() : Class0(){}
}
如果有非默认构造函数,则不再生成无参数构造函数。定义以下内容时:
class Class0 {
public:
Class0(int param){}
}
class Class1 : public Class0 {
}
编译器不再在Class1中生成构造函数来调用基类的构造函数,您必须自己显式地这样做。在处理派生类之前,您必须先构造基类。若你们用非平凡的构造函数构造你们的派生类,编译器就不能决定调用什么作为基,这就是为什么会发生错误。我想你们误读了他的问题。他不是问为什么不能调用Class1的默认构造函数,而是问为什么没有Class1(int)构造函数可以调用。在上一个示例中,编译器仍然生成
Class1()
构造函数。只是如果实际定义了这个构造函数,那么它的格式是错误的(默认情况下,对于所有特殊函数,只有在实际使用之前才会声明它)。您可以通过将其设置为好友来验证这一点:Class2{friend Class1::Class1();}代码>,这是因为编译器隐式声明默认构造函数,而不管它是否可以实际调用。谢谢。这让我很清楚。虽然我很欣赏Shirik的回答,但我相信你的示例准确地显示了我的代码中发生了什么。@Johannes Schaub-litb谢谢你的回答,我不知道。如果基类有默认构造函数,如果没有在派生类中构造函数的初始值设定项列表中显式指定构造函数,编译器将使用该构造函数。谢谢。我没有意识到构造函数从未被继承。我确信其他基类构造函数(在真实代码中)实际上是可见的,但我现在将其归因于编译器可能一直在做的一系列转换。我很遗憾,作为一个新手,我还没有足够的声望来支持你的答案。我想我可以早点回家。。。现在我必须加班,在我的子类中填写完全相同的代码行。