c++ - 在派生类的字段中运行的代码顺序是什么?我想知道为什么我得到这个输出,我无法理解
问题描述
我不知道代码运行的顺序,请教我当我创建一个点A *p=new C时,会发生什么?我什至无法理解这个方程,为什么它们的类不同,它仍然可以编译?
#include <iostream>
using namespace std;
class A
{
public:
A( ){cout << "A Constructor" << endl;}
virtual ~A( ){cout << "A Destructor" << endl;}
virtual void f( ){cout << "A::f( )" << endl;}
void g( ){ f( ); }
};
class B:public A
{
public:
B( ){f();cout <<"B Constructor" << endl;}
~B( ){cout << "B Destructor" << endl;}
};
class C:public B
{
public:
C( ){f( ); cout << "C Constructor" << endl;}
~C( ){cout << "C Destructor" << endl;}
void f( ){cout << "C::f( )" << endl;}
};
int main()
{
A *p=new C;
p->g( );
delete p;
}
输出是
A Constructor
A::f( )
B Constructor
C::f( )
C Constructor
C::f( )
C Destructor
B Destructor
A Destructor
解决方案
A *p=new C,
可以编译,因为C
派生自(或继承自)A
。就是这样
class C:public B
class B:public A
方法。C
派生自B
派生自A
。
这意味着每个对象内部都C
包含一个对象,每个对象内部都包含一个对象。这就是为什么你看到你看到的输出。当你构造一个对象时,它也构造了它内部的对象,这也构造了对象内部的对象。B
B
A
C
B
A
B
这也意味着可以自动将C*
指针转换为B*
指针,并将B*
指针自动转换为A*
指针。这就是代码编译的原因。
这是关于类继承的基本信息。我不知道你从哪里得到这个代码,但它应该已经解释了这一点。也许你需要买一本关于 C++的好书。
推荐阅读
- arrays - 数组上的重复操作
- node.js - 在 MongoDB 上进行递归查找,查找每个结果项
- pandas - 调整 searbon 热图中子批次的颜色(来自循环)
- processing - 如何加载 .csv 文件并在处理中绘制 2d 形状
- python - AssertionError: 302 != 200 : 无法检索内容:响应代码为 302(预期为 200)
- python - 模块“numpy”没有属性行空间
- php - 如何在循环中使用变量查询 mysqli db (php)
- vba - 调用 SAP RFC_READ_TABLE 时出现错误索引
- firebase - 使用 Kotlin 使用 Firebase 登录 Google 中的 GetEmail() Null
- spring - Log4j-配置和级别的区别