继承和编译器生成的函数
Inheritance and Compiler-Generated functions
当我有继承时,我通常得到的编译器生成的函数(构造函数、析构函数、赋值运算符和复制构造函数)是否仍然为我的类生成?
假设我有这样的继承:一个基类,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.
因此,经验法则是,如果您提供自己的构造函数,请始终提供默认的构造函数。
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 填充上编译器生成的复制构造函数之间的不一致
- 编译器找不到'aligned_alloc'函数
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 为什么编译器将其解析为函数指针而不是递归调用?
- 表达式未评估为常数两个级别的constexpr函数(编译器错误?)
- 从 std::streambif 继承时不兼容析构函数编译器警告
- 在构造函数 - 编译器错误中调用的成员变量的驱动器
- 复制初始化和显式构造函数-编译器的差异
- 静态函数编译器优化C++
- 为什么派生类虚函数可以调用基类虚函数?编译器如何实现
- 复制构造函数 - 编译器错误 C2040 和 C2440
- 带有模板返回类型的虚基函数:编译器在使用pointtype作为模板参数的派生类时失败(MSVC 2013)
- C++中虚拟函数编译器的作用