Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从嵌套抽象父类调用构造函数的问题_C++_Constructor - Fatal编程技术网

C++ 从嵌套抽象父类调用构造函数的问题

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

我有下面的代码片段,希望调用父类First::internal中的构造函数

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;
};