求分析一段代码

zzh0126 2012-05-16 12:58:55
#include <iostream.h>
class A
{
public:
A()
{cout<<"In A cons.\n";}
virtual ~A()
{cout<<"In A des.\n";}
virtual void f1()
{cout<<"In A f1().\n";}
void f2()
{f1();}
};

class B:public A
{
public:
B()
{f1();cout<<"In B cons.\n";}
~B()
{cout<<"In B des.\n";}
};

class C:public B
{
public:
C()
{cout<<"In C cons.\n";}
~C()
{cout<<"In C des.\n";}
void f1()
{cout<<"In C f1().\n";}
};

void main()
{
A *pa=new C;
pa->f2();
delete pa;
}


运行结果
In A cons.
In A f1().
In B cons.
In C cons.
In C f1().
In C des.
In B des.
In A des.

...全文
66 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
采石工 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

引用 1 楼 的回复:

构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

我补充一下,f2是非虚函数,通过pa调用它会直接调用A::f2,A::f2内部又调用了this->f1,而f1是虚函数,运行时会发生动态绑定,在这里调用的是C::f1.

还是你针对这题回答的透彻 我还有个问题 ,基类和派生类的构……
[/Quote]
这个问题一楼已经回答过了。根据继承关系依次调用各基类的构造函数,然后调用自身的构造函数。有一个顺序。
zzh0126 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 的回复:

构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

我补充一下,f2是非虚函数,通过pa调用它会直接调用A::f2,A::f2内部又调用了this->f1,而f1是虚函数,运行时会发生动态绑定,在这里调用的是C::f1.
[/Quote]
还是你针对这题回答的透彻 我还有个问题 ,基类和派生类的构造函数一开始就会全部调用吗
Heaven13483 2012-05-16
  • 打赏
  • 举报
回复
构造函数是从基类开始的。。所有顺序是 A,B; 析构是从子类开始的 所以是c,B,A
采石工 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A
[/Quote]
我补充一下,f2是非虚函数,通过pa调用它会直接调用A::f2,A::f2内部又调用了this->f1,而f1是虚函数,运行时会发生动态绑定,在这里调用的是C::f1.
薛定谔之死猫 2012-05-16
  • 打赏
  • 举报
回复
构造函数从最顶层基类开始调用,在这类未指明基类的构造函数调用方法,因此使用缺省的构造函数;析构函数和构造函数是逆向的顺序进行的,这很好理解;虚函数用于实现运行时多态,不管持有的指针描述符是基类的还是派生类的,都通过虚函数表头指针的迭代最终执行真实对象所拥有的成员函数。这些都是C++的基础了,随便找本C++的书都能看到这些信息~
zzh0126 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A
[/Quote]
这个在哪边建立对象的
笨笨周0915 2012-05-16
  • 打赏
  • 举报
回复
构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧