class SuperClass
{
public:
SuperClass(int foo)
{
// do something with foo
}
};
class SubClass : public SuperClass
{
public:
SubClass(int foo, int bar)
: SuperClass(foo)
{
// do something with bar
}
};
Subclass是否继承了超类的构造函数?
它的继承是什么以及为什么我需要在子类构造函数中指定: SuperClass(foo)
?
答案 0 :(得分:2)
否SubClass
不继承构造函数。例如,您不能像使用继承的函数一样调用SuperClass
之一的构造函数。
但SubClass
是由您的继承定义的SuperClass
。因此,为了成为SuperClass
,它不仅要创建自己,还要创建SuperClass
这是使用构造函数完成的。由于您没有定义默认构造函数(一个没有参数),编译器无法知道要调用哪个构造函数。这就是为什么你需要明确写出SubClass
应该使用哪个构造函数来创建SuperClass
的原因。
答案 1 :(得分:2)
构造函数不是继承的,但必须调用它们。
如果您的基类具有默认构造函数,那么如果您未指定替代项,派生类将自动为您调用此类。您必须指定对基类构造函数的调用的原因是因为该类指定必须使用整数进行初始化,并且作为派生类,您有责任确保正确初始化基类。
答案 2 :(得分:0)
不,子类不“继承”基类构造函数。语法确实相似,但其含义却截然不同。发生了什么是子类的构造函数在其他任何东西之前初始化它的超类对象的内部副本。您必须手动指定此原因的原因是,基类可能具有不同的构造函数,您可能希望使用特定的参数调用某个子类构造函数。
答案 3 :(得分:0)
没有构造函数不被继承,你需要使用:SuperClass(foo),因为你试图将参数传递给基类构造函数。如果你没有指定编译器,确保基类默认构造函数(零参数构造函数)是在派生类对象时被调用。 但是在你的情况下你还没有定义零参数构造函数。确保你在删除':SuperClass(foo)'之前定义它!!!“
答案 4 :(得分:-1)
Subclass是否继承了超类的构造函数?
是的,确实
它的继承是什么以及为什么我需要在子类构造函数中指定:SuperClass(foo)?
因为你的SuperClass不提供默认构造函数(带参数),编译器不知道如何构造SuperClass对象,你必须告诉他foo
是foo