首页 > 解决方案 > 在派生类的字段中运行的代码顺序是什么?我想知道为什么我得到这个输出,我无法理解

问题描述

我不知道代码运行的顺序,请教我当我创建一个点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

标签: c++

解决方案


A *p=new C,可以编译,因为C派生(或继承自)A。就是这样

class C:public B

class B:public A

方法。C派生自B派生自A

这意味着每个对象内部都C包含一个对象,每个对象内部都包含一个对象。这就是为什么你看到你看到的输出。当你构造一个对象时,它也构造了它内部的对象,这也构造了对象内部的对象。BBACBAB

这也意味着可以自动将C*指针转换为B*指针,并将B*指针自动转换为A*指针。这就是代码编译的原因。

这是关于类继承的基本信息。我不知道你从哪里得到这个代码,但它应该已经解释了这一点。也许你需要买一本关于 C++的好书。


推荐阅读