为什么为派生 class 定义复制构造函数需要为基 class 定义默认构造函数?
Why does defining a copy constructor for derived class requires that the default constructor for base class be defined?
我在单个 cpp 文件中有以下代码:
class Base
{
public:
//constructor
Base() = delete;
};
class Derived : public Base
{
public:
//copy constructor
Derived( const Derived & other ){};
};
int main( int argc, char* argv[] )
{
//empty
}
但是编译cpp文件出错
exp.cpp: In copy constructor ‘Derived::Derived(const Derived&)’:
exp.cpp:15:37: error: use of deleted function ‘Base::Base()’
Derived( const Derived & other ){};
exp.cpp:7:5: note: declared here
Base() = delete;
^~~~
我不明白为什么。当您为派生 class 定义复制构造函数时,基础 class 默认构造函数如何发挥作用?
构造派生的对象class需要构造其基础对象class(因为派生实例是基础实例+扩展)。
因此初始化派生实例需要初始化基础实例。那么问题是,当我为派生 class 调用一个构造函数时,调用了基 class 的哪个构造函数?正如您将派生 ctor 定义为:
Derived( const Derived & other ){};
编译器观察到您没有指定对特定基础 class 构造函数的调用,然后它会生成对不带参数的构造函数的调用。但是,唉,你把它从基础 class 中删除了。然后它会发出一个错误。
您可能认为调用派生 class 的复制构造函数将生成对未删除的基 class 的复制构造函数的调用。但是,唉,不,规则是如果你没有为基class指定一个特定的ctor调用,那么调用没有参数的ctor。
我在单个 cpp 文件中有以下代码:
class Base
{
public:
//constructor
Base() = delete;
};
class Derived : public Base
{
public:
//copy constructor
Derived( const Derived & other ){};
};
int main( int argc, char* argv[] )
{
//empty
}
但是编译cpp文件出错
exp.cpp: In copy constructor ‘Derived::Derived(const Derived&)’:
exp.cpp:15:37: error: use of deleted function ‘Base::Base()’
Derived( const Derived & other ){};
exp.cpp:7:5: note: declared here
Base() = delete;
^~~~
我不明白为什么。当您为派生 class 定义复制构造函数时,基础 class 默认构造函数如何发挥作用?
构造派生的对象class需要构造其基础对象class(因为派生实例是基础实例+扩展)。
因此初始化派生实例需要初始化基础实例。那么问题是,当我为派生 class 调用一个构造函数时,调用了基 class 的哪个构造函数?正如您将派生 ctor 定义为:
Derived( const Derived & other ){};
编译器观察到您没有指定对特定基础 class 构造函数的调用,然后它会生成对不带参数的构造函数的调用。但是,唉,你把它从基础 class 中删除了。然后它会发出一个错误。
您可能认为调用派生 class 的复制构造函数将生成对未删除的基 class 的复制构造函数的调用。但是,唉,不,规则是如果你没有为基class指定一个特定的ctor调用,那么调用没有参数的ctor。