C++ 从嵌套抽象父类调用构造函数的问题
我有下面的代码片段,希望调用父类First::internal中的构造函数C++ 从嵌套抽象父类调用构造函数的问题,c++,constructor,C++,Constructor,我有下面的代码片段,希望调用父类First::internal中的构造函数 class First { public: class Inner { public: Inner(int x) {} virtual ~Inner() = default; }; virtual Inner* begin() = 0; }; class Second: pub
class First {
public:
class Inner {
public:
Inner(int x) {}
virtual ~Inner() = default;
};
virtual Inner* begin() = 0;
};
class Second: public First {
public:
class Inner: public First::Inner {
};
Inner* begin() {
return new Inner(1);
}
};
int main()
{
Second s;
return 0;
}
相反,我在编译器中遇到了一个编译错误:
main.cpp: In member function ‘virtual Second::Inner* Second::begin()’:
main.cpp:16:31: error: no matching function for call to ‘Second::Inner::Inner(int)’
如果将整个构造函数Innerint x{}从基类First::Inner移动到派生的Second::Inner,则该函数可以工作。但是我想把构造函数保留在基类中
代码有什么问题,我如何修复错误?问题在于,类Second::Inner没有一个接受int的构造函数,然后是new Inner1;这将失败 你可以喜欢 如果using声明引用的是 正在定义的类,例如使用Base::Base;,所有施工人员 忽略成员访问的基础对重载可见 初始化派生类时的解析 当 初始化此类派生类的对象,然后初始化基子对象 使用 继承的构造函数,以及派生的所有其他基和成员 如同由默认构造函数默认成员初始化一样初始化 如果提供了初始值设定项,则使用初始值设定项,否则使用默认初始化 发生了。整个初始化过程被视为一个单独的初始化过程 函数调用:初始化继承函数的参数 构造函数在初始化任何基或成员之前排序 派生对象的属性
问题是,类Second::Inner没有一个构造函数接受int,然后是newinner1;这将失败 你可以喜欢 如果using声明引用的是 正在定义的类,例如使用Base::Base;,所有施工人员 忽略成员访问的基础对重载可见 初始化派生类时的解析 当 初始化此类派生类的对象,然后初始化基子对象 使用 继承的构造函数,以及派生的所有其他基和成员 如同由默认构造函数默认成员初始化一样初始化 如果提供了初始值设定项,则使用初始值设定项,否则使用默认初始化 发生了。整个初始化过程被视为一个单独的初始化过程 函数调用:初始化继承函数的参数 构造函数在初始化任何基或成员之前排序 派生对象的属性
这种行为实际上与嵌套类无关。你可以去掉First和Second,将First::Inner重命名为A,将Second::Inner重命名为B继承A,任何试图用int初始化B的函数都会给出类似的错误。消息的意思与它所说的完全相同。Second::Inner没有强调int类型参数的构造函数。事实上,在First::Inner中有一个构造函数不会导致为Second::Inner生成一个构造函数。您可以实现Second::Inner的构造函数,这样它就可以通过在initialiser列表中使用int调用First::Inners构造函数来初始化其基。这种行为实际上与嵌套类无关。你可以去掉First和Second,将First::Inner重命名为A,将Second::Inner重命名为B继承A,任何试图用int初始化B的函数都会给出类似的错误。消息的意思与它所说的完全相同。Second::Inner没有强调int类型参数的构造函数。事实上,在First::Inner中有一个构造函数不会导致为Second::Inner生成一个构造函数。您可以实现Second::Inner的构造函数,这样它就可以通过在initialiser列表中使用int调用First::Inner构造函数来初始化它的基。
class Inner: public First::Inner {
using First::Inner::Inner;
};