求分析一段代码

时间:2022-09-03 10:19:28
#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.

7 个解决方案

#1


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

#2


引用 1 楼  的回复:
构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

这个在哪边建立对象的

#3


构造函数从最顶层基类开始调用,在这类未指明基类的构造函数调用方法,因此使用缺省的构造函数;析构函数和构造函数是逆向的顺序进行的,这很好理解;虚函数用于实现运行时多态,不管持有的指针描述符是基类的还是派生类的,都通过虚函数表头指针的迭代最终执行真实对象所拥有的成员函数。这些都是C++的基础了,随便找本C++的书都能看到这些信息~

#4


引用 1 楼  的回复:
构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

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

#5


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

#6


引用 4 楼  的回复:
引用 1 楼  的回复:

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

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

还是你针对这题回答的透彻 我还有个问题 ,基类和派生类的构造函数一开始就会全部调用吗

#7


引用 6 楼  的回复:
引用 4 楼  的回复:

引用 1 楼  的回复:

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

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

还是你针对这题回答的透彻 我还有个问题 ,基类和派生类的构……

这个问题一楼已经回答过了。根据继承关系依次调用各基类的构造函数,然后调用自身的构造函数。有一个顺序。

#1


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

#2


引用 1 楼  的回复:
构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

这个在哪边建立对象的

#3


构造函数从最顶层基类开始调用,在这类未指明基类的构造函数调用方法,因此使用缺省的构造函数;析构函数和构造函数是逆向的顺序进行的,这很好理解;虚函数用于实现运行时多态,不管持有的指针描述符是基类的还是派生类的,都通过虚函数表头指针的迭代最终执行真实对象所拥有的成员函数。这些都是C++的基础了,随便找本C++的书都能看到这些信息~

#4


引用 1 楼  的回复:
构造函数是从基类开始的。。所有顺序是 A-》B-》 析构是从子类开始的 所以是c-》B-》A

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

#5


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

#6


引用 4 楼  的回复:
引用 1 楼  的回复:

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

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

还是你针对这题回答的透彻 我还有个问题 ,基类和派生类的构造函数一开始就会全部调用吗

#7


引用 6 楼  的回复:
引用 4 楼  的回复:

引用 1 楼  的回复:

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

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

还是你针对这题回答的透彻 我还有个问题 ,基类和派生类的构……

这个问题一楼已经回答过了。根据继承关系依次调用各基类的构造函数,然后调用自身的构造函数。有一个顺序。