| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1497 人关注过本帖
标题:请教大家一个简单的程序
取消只看楼主 加入收藏
boyyang4894
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-13
收藏
 问题点数:0 回复次数:5 
请教大家一个简单的程序

谁能告诉我执行该程序的顺序,谢谢;

#include<iostream>
using namespace std;
class A
{public:
virtual void fun1()
{cout<<"a1";}
virtual void fun2()
{cout<<"a2";}
};
class B: public A
{public:
B():A()
{fun1();}
void fun()
{fun1();}
~B()
{fun2();}
};
class C: public B
{
public:
void fun1()
{cout<<"c1";}
void fun2()
{cout<<"c2";}
~C()
{fun2();}
};

int main()
{
C obj;
obj.fun();

return 0;
}

搜索更多相关主题的帖子: include public 
2007-03-31 19:11
boyyang4894
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-13
收藏
得分:0 
回复:(游乐园)从主函数开始执行 C obj: 创建C的对象...
可不可以这样看:
1. C创建后调用类C的构造函数,由于C是B的派生则先调用B的构,又因为B是A的派生,所以先调用A的构造.A没有定义则系统建立一个空的构造函数并执行.然后在执行B的构造.在B构造中有fun1()//我想问此时执行的是哪个fun1(),为什么是类A中的?
最后是C中的构造,同类A一样由系统自动生成空函数并执行.
2.obj.fun() 调用类B中void fun().//
fun()中的fun1()又是哪个,这怎么又是C中的了?
3.析构 C的对象 调用fun2() 输出c2
4.析构 B的对象 调用fun2() 即从父类A继承过来的fun2 输出a2
//为什么调用的是A中的fun2()?


[此贴子已经被作者于2007-3-31 20:06:31编辑过]

2007-03-31 19:40
boyyang4894
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-13
收藏
得分:0 

是不是说
1.当建立对象时只是先调用该对象的类的构造函数,其他的成员函数并没有建立.只有在所有的构造函数(如:该程序)执行完之后才建立成员函数.
2.在析构时则撤消该类的所有成员函数包括构造函数

2007-03-31 20:19
boyyang4894
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-13
收藏
得分:0 
这里的虚函数的作用是什么?

1.不是说基类如果定义了虚函数,那么在它的派生类中如果出现跟其定义的虚函数一样的函数(包括类型,参数类型及个数)时,用基类指针(或引用)指向派生类中该函数,则调用的是当前派生类中的函数而不是基类中被定义为虚函数的函数.

2.还有C++规定了,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数.

所以我总是想不通下面的问题:
class B: public A
{public:
B():A()
{fun1();}//根据2 这个也是虚函数了?下面fun()里的fun1()也是?
void fun()
{fun1();}//根据1 这个fun1()所在当前的类是类C,而不是类B,why ?难道是因为执行了main中的 obj.fun?
~B()
{fun2();}
};

[此贴子已经被作者于2007-3-31 21:20:41编辑过]

2007-03-31 21:14
boyyang4894
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-13
收藏
得分:0 
明白了
那么同样的 下面这个程序:看我说的对不
#include<iostream>
using namespace std;
class A
{ public:
A(){f();}// 1 由构造顺序知先执行此函数.其中的f()指的是下面一行的f()所以最先输出a;
void f(){cout<<"a";}
};
class B:public A
{public:
B(){f();}// 2 再执行该行,其中的f()指的是下面的f()
virtual void f(){cout<<"b";} //由于函数的覆盖所以再输出b;
};
class C:public B
{public:
C(){f();}// 3 接着执行该行,其中的f()指的是下面的f()
void f(){cout<<"C";}// 由于其直接基类中的void f()定义为虚函数,所以输出的是c;
};
int main()
{
C obj;
}

所以该程序输出abc
2007-03-31 21:50
boyyang4894
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2007-2-13
收藏
得分:0 
谢谢大侠~~
2007-03-31 22:01
快速回复:请教大家一个简单的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039992 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved