12

我有一个声明和定义构造函数的基类,但由于某种原因,我的公共派生类没有看到该构造函数,因此我必须在派生类中显式声明一个转发构造函数:

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)声明被编译器拒绝(“No matching function for call to 'WireCount1::WireCount1(int)'”),而我的wireCount0wireCount2声明很好。

我不确定我是否理解为什么需要提供中所示的显式构造函数WireCount2。是因为编译器为 生成了默认构造函数WireCount1,而该构造函数隐藏了WireCount0构造函数吗?

作为参考,编译器是i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659).

4

3 回答 3

15

构造函数不被继承。您必须为派生类创建一个构造函数。此外,派生类的构造函数必须调用基类的构造函数。

于 2010-07-10T01:37:56.607 回答
9

所有派生类都必须以某种形式或形式调用其基类的构造函数。

创建重载构造函数时,默认编译器生成的无参数构造函数会消失,派生类必须调用重载构造函数。

当你有这样的事情:

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 中生成构造函数来调用基类的构造函数,您必须自己显式执行此操作。

于 2010-07-10T01:41:15.083 回答
1

在处理派生之前,您必须构造您的基类。如果您使用非平凡的构造函数构造派生类,编译器无法决定调用什么基类,这就是发生错误的原因。

于 2010-07-10T01:43:18.153 回答