继承和编译器生成的函数
Inheritance and Compiler-Generated functions
当我有继承时,我通常得到的编译器生成的函数(构造函数、析构函数、赋值运算符和复制构造函数)是否仍然为我的 classes 生成?
假设我有这样的继承:基数 class、继承 A (public) 的 B 和 public 继承 B 的 C。
我的 A class 没有内存分配或任何需要我实现析构函数的东西,而且我没有在那里实现析构函数,当我编译我的程序时它仍然会创建一个空的 A::~A(){}
吗?
B 和 C 相同。谢谢!
rule of 5 仍然适用于每个 classes,独立于它们的继承。
换句话说,如果B
派生自A
,只是因为A
定义了它们的拷贝构造函数,这并不影响B
的生成复制构造函数。
但是,您应该注意为基 class if needed.
定义一个 virtual
析构函数
当然可以。 constructor/destructor 链式调用仍然存在(即,C 析构函数将调用 B 析构函数,B 析构函数调用 A 析构函数,构造函数的顺序相反)。
是的,编译器总是为 类 生成(构造函数、析构函数、赋值运算符和复制构造函数),其中用户没有明确定义这些函数。
如果用户未定义,编译器会在 class 中插入构造函数、析构函数、复制构造函数和重载赋值运算符。
但最重要的是,如果用户在 class 中定义了参数化构造函数,则编译器将不会生成默认构造函数,并且没有任何参数的对象创建将抛出链接器错误。
比如说你有一个 class A
class A
{
int a;
public:
//.....
//some line of code
//.....
}
如果您不提供任何构造函数,编译器将生成一个不带任何参数的默认构造函数A(){}
。
但是如果你有机会声明一个参数化的构造函数,比如
A(int i)
{
a = i;
}
编译器不会生成任何默认构造函数,您创建不带参数的对象将失败。
A a; ---> This will fail.
A b(10) ---> This will pass.
所以规则是,如果您要提供自己的构造函数,请始终提供默认构造函数。
当我有继承时,我通常得到的编译器生成的函数(构造函数、析构函数、赋值运算符和复制构造函数)是否仍然为我的 classes 生成?
假设我有这样的继承:基数 class、继承 A (public) 的 B 和 public 继承 B 的 C。
我的 A class 没有内存分配或任何需要我实现析构函数的东西,而且我没有在那里实现析构函数,当我编译我的程序时它仍然会创建一个空的 A::~A(){}
吗?
B 和 C 相同。谢谢!
rule of 5 仍然适用于每个 classes,独立于它们的继承。
换句话说,如果B
派生自A
,只是因为A
定义了它们的拷贝构造函数,这并不影响B
的生成复制构造函数。
但是,您应该注意为基 class if needed.
定义一个virtual
析构函数
当然可以。 constructor/destructor 链式调用仍然存在(即,C 析构函数将调用 B 析构函数,B 析构函数调用 A 析构函数,构造函数的顺序相反)。
是的,编译器总是为 类 生成(构造函数、析构函数、赋值运算符和复制构造函数),其中用户没有明确定义这些函数。
如果用户未定义,编译器会在 class 中插入构造函数、析构函数、复制构造函数和重载赋值运算符。
但最重要的是,如果用户在 class 中定义了参数化构造函数,则编译器将不会生成默认构造函数,并且没有任何参数的对象创建将抛出链接器错误。
比如说你有一个 class A
class A
{
int a;
public:
//.....
//some line of code
//.....
}
如果您不提供任何构造函数,编译器将生成一个不带任何参数的默认构造函数A(){}
。
但是如果你有机会声明一个参数化的构造函数,比如
A(int i)
{
a = i;
}
编译器不会生成任何默认构造函数,您创建不带参数的对象将失败。
A a; ---> This will fail.
A b(10) ---> This will pass.
所以规则是,如果您要提供自己的构造函数,请始终提供默认构造函数。