Bri*_*ndy 64
订单是:
例:
class B
{
public:
B()
{
cout<<"Construct B"<<endl;
}
virtual ~B()
{
cout<<"Destruct B"<<endl;
}
};
class D : public B
{
public:
D()
{
cout<<"Construct D"<<endl;
}
virtual ~D()
{
cout<<"Destruct D"<<endl;
}
};
int main(int argc, char **argv)
{
D d;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出示例:
构建B
构造D.
破坏D.
破坏B.
多级继承的工作方式类似于堆栈:
如果你考虑将一个项目作为构造推送到堆栈中,并将其作为销毁,那么你可以像堆栈一样查看多个级别的继承.
这适用于任何级别.
示例D2派生自D派生自B.
将B推入堆叠,将D推入堆叠,将D2推入堆叠.所以施工顺序是B,D,D2.然后找出销毁订单开始弹出.D2,D,B
更复杂的例子:
有关更复杂的示例,请参阅@JaredPar提供的链接
Jar*_*Par 22
C++ FAQ Lite提供了这些事件的详细说明,包括虚拟和多重继承.第25.14和25.15节
https://isocpp.org/wiki/faq/multiple-inheritance#mi-vi-ctor-order
Fer*_*cio 10
另外,请记住,虽然数组元素是首先构造的 - >最后一个,但是它们是以相反的顺序被破坏的:last - > first.
我必须补充前面的答案,因为每个人似乎都忽略了它
你有一个当派生被类实例创建,它是真实的代码里的的构造基地将被调用之前的代码里面的的构造函数派生,但要记住的是,得到的仍是技术上的“创造” 之前的基地。
而当你有派生类的析构函数被调用,这是事实,代码里面派生的析构函数被调用之前的代码里面基本的析构函数,也请记住,该基地被摧毁 前的导出。
当我说的创建/毁我实际上指的是分配/释放。
如果查看这些实例的内存布局,将会看到派生实例构成了基本实例。例如:
0x00001110到0x00001120:衍生的存储器
碱的存储器:0x00001114到0x00001118
因此,必须在构造中的基础之前分配派生类。并且必须在破坏的基础之后将派生类释放。
如果您具有以下代码:
class Base
{
public:
Base()
{
std::cout << "\n Base created";
}
virtual ~Base()
{
std::cout << "\n Base destroyed";
}
}
class Derived : public Base
{
public:
Derived()
// Derived is allocated here
// then Base constructor is called to allocate base and prepare it
{
std::cout << "\n Derived created";
}
~Derived()
{
std::cout << "\n Derived destroyed";
}
// Base destructor is called here
// then Derived is deallocated
}
Run Code Online (Sandbox Code Playgroud)
所以,如果你创建Derived d;,把它走出去的范围,那么你会得到的输出@布赖恩的答案。但在内存中的对象的行为是不是真的在相同的顺序,它更像是这样的:
施工:
派生分配
基本分配
所谓的基本构造
派生的构造函数称为
毁灭:
派生的析构函数称为
所谓基本析构函数
基本释放
派生释放
| 归档时间: |
|
| 查看次数: |
31643 次 |
| 最近记录: |