C++ 继承和编译器生成的函数

C++ 继承和编译器生成的函数,c++,c++11,inheritance,destructor,C++,C++11,Inheritance,Destructor,当我继承时,我通常得到的编译器生成的函数(构造函数、析构函数、赋值运算符和复制构造函数)是否仍然为我的类生成 假设我有这样的继承:一个基类,B继承A(public),C继承B。 我的A类没有内存分配或任何需要我实现析构函数的东西,我也没有在那里实现析构函数,当我编译我的程序时,它还会创建一个空的A::~A(){} B和C也一样。。谢谢大家! 仍然适用于每个类,与它们的继承无关 换句话说,如果B是从A派生的,仅仅因为A定义了它们的复制构造函数,这不会影响B的复制构造函数的生成 但是,您应该注意为基

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

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

B和C也一样。。谢谢大家!

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

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


但是,您应该注意为基类定义一个
虚拟的
析构函数。

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

是的,编译器始终为类生成(构造函数、析构函数、赋值运算符和复制构造函数),如果用户没有明确定义这些函数,编译器将在类中插入构造函数、析构函数、复制构造函数和重载赋值运算符(如果用户没有定义)

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

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

因此,根据经验,如果您要提供自己的构造函数,请始终提供默认构造函数。

如果没有其他方法阻止编译器生成函数,则将创建它们。但是要小心,因为它可能不会在所有情况下都像预期的那样运行,特别是在基类中有非虚拟析构函数的情况下。