继承和编译器生成的函数

Inheritance and Compiler-Generated functions

本文关键字:函数 编译器 继承      更新时间:2023-10-16

当我有继承时,我通常得到的编译器生成的函数(构造函数、析构函数、赋值运算符和复制构造函数)是否仍然为我的类生成?

假设我有这样的继承:一个基类,B继承A(public),C继承public。我的A类没有内存分配,也没有任何需要我实现析构函数的东西,而且我没有在那里实现析构因子,当我编译程序时,它还会创建一个空的A::~A(){}吗?

B和C也是。谢谢!

5的规则仍然适用于每个类,与它们的继承无关。

换句话说,如果B是从A派生的,仅仅因为A定义了它们的复制构造函数,这不会影响B的复制构造函数的生成。

但是,如果需要,您应该注意为基类定义virtual析构函数。

当然可以。构造函数/析构函数的链式调用仍然存在(即,C析构函数将调用B析构函数,而B则调用A析构函数。构造函数的顺序与此相反)。

是的,编译器总是为类生成(构造函数、析构函数、赋值运算符和复制构造函数),而用户没有明确定义这些函数。

编译器在类中插入构造函数、析构函数、复制构造函数和重载赋值运算符(如果不是由用户定义的)。

但最重要的是,如果用户在类中定义了参数化构造函数,那么编译器将不会生成默认构造函数,并且在没有任何参数的情况下创建对象将引发链接器错误。

比如说你有一个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.

因此,经验法则是,如果您提供自己的构造函数,请始终提供默认的构造函数。