继承和编译器生成的函数

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.

所以规则是,如果您要提供自己的构造函数,请始终提供默认构造函数。