【发布时间】:2019-12-14 13:24:36
【问题描述】:
我有多个继承类,但报错C2<int (__cdecl *)(int)>': no appropriate default constructor available,但我为C1,C2 定义了参数化构造函数。
一个相关的问题是我在某些代码中看到了标记为??? 的注释行。这是什么意思 - 它正在从 C3 初始化 C2 的默认构造函数?
#include <iostream>
int y(int)
{ int a=1; return a }
template<typename F>
class C1
{
public:
F f1;
C1(F g) : f1(g) {}
};
template<typename F>
class C2 : public C1<F>
{
public:
F f2;
C2(F g) : f2(g) {}
};
template<typename F>
class C3 : public C2<F>
{
public:
F f3;
C3(F g) : f3(g) {}
//C3 (F g) : C2<F>(g) {} ???
};
int main()
{
C1 o1(y);
C2 o2(y);
C3 o3(y);
}
【问题讨论】:
-
C1没有默认构造函数,只有一个带参数的构造函数。 C2 继承自 C1,但调用了 C2 的默认构造函数,该构造函数不存在。出于同样的原因,从 C2 继承的 C3 也存在同样的问题。编译器的错误信息非常清楚,并且确切地说明了这一点。这 ???是通过调用其构造函数来构造超类的示例。但这本身并不能解决这个问题,C2 调用 C1 的构造函数也需要同样的事情。