勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

金山2009校园招聘成都一笔试题

 1# include <iostream>
 2using namespace std;
 3
 4class base
 5{
 6public:
 7    base()
 8    {
 9        cout <<" base::val "<<endl;
10        val = 12345;
11        print();
12    }

13    base(int x)
14    {
15        val = x;
16        cout << " "<<endl;
17    }

18    virtual void print()
19    {
20        cout << " base:print(), val = "<<val<<endl;
21    }

22    base & operator = (int x)
23    {
24        val = x;
25        cout <<" base::operator, val = "<<x<<endl;
26        return *this;
27    }

28    void relase()
29    {
30        cout << " base::relase" <<endl;
31    }

32    ~base()
33    {
34        cout << " ~base::val = "<< val <<endl;
35    }

36protected:
37    int  val;
38}
;
39
40class deiver:public base
41{
42public:
43    deiver()
44    {
45        cout << " deiver::val "<<endl;
46    }

47    
48    deiver(int x)
49    {
50        val = x;
51        print();
52    }

53    void print()
54    {
55        cout << " deiver::print(), val =  "<< val <<endl;
56    }

57    void relase()
58    {
59        cout << " deiver::relase, val = "<<val<<endl;
60    }

61    deiver & operator = (int x)
62    {
63        val = x;
64        cout <<" deiver::operator, val = "<<x<<endl;
65        return *this;
66    }

67    ~deiver()
68    {
69        cout << " deiver::~deiver "<<endl;
70    }

71}
;
72void des(base * b)
73{
74    b->print();
75    b->relase();
76}

77deiver  de = 98765;
78int main()
79{
80        deiver  * dee = new deiver;
81    *(base *)dee = 100;
82    des(dee);
83
84    return 0;
85}

86

输出结果。。。
因为de是全局变量,所以先调用基类构造函数,在调用子类的带int的构造方法。。
然后dee同理先基类构造函数,然后调用默认构造函数。

最后dee强制转换为基类指针进行复制,根据多态,调用基类的operator=方法
最后调用子类的print和父类的relase方法。

因为print是虚函数


运算结果为
 base::val
 base:print(), val = 12345
 deiver::print(), val =  98765
 base::val
 base:print(), val = 12345
 deiver::val
 base::operator, val = 100
 deiver::print(), val =  100
 base::relase

posted on 2008-10-20 20:30 expter 阅读(3642) 评论(10)  编辑 收藏 引用 所属分类: 面试笔记

评论

# re: 金山2009校园招聘成都一笔试题 2008-10-20 21:53 zllp@live.com

The destructor of class base should be virtual, I think.  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题 2008-10-21 01:20 Fox

并不是所有基类的析构都要virtual的,此例即不需要,因为这儿的析构是trivial的,推荐阅读lippman的<inside the c++ object model>.

  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题 2008-10-21 08:56 powerlang

base::val
base:print(), val = 12345
deiver::print(), val = 98765
base::val
base:print(), val = 12345
deiver::val
base::operator, val = 100
deiver::print(), val = 100
base::relase
deiver::~deiver
~base::val = 98765


上面是我运行的结果,很奇怪,全局变量没有析构  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题[未登录] 2008-10-21 09:18 Kevin Lynx

@Fox
从设计角度来看,即使destructor是trivial的,但是因为基类和派生类存在多态的使用,即对于应用层而言有类似的代码:
base *pObj = new derived();
那么,destructor都应该为virtual的。
  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题[未登录] 2008-10-21 09:19 Kevin Lynx

据以前在金山工作过的两个朋友所说,金山加班严重(就是成都金山),不敢去。想多活几年。
  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题 2008-10-21 11:28 许海林

小弟有个疑问:
将上面程序稍作改动:
deiver dee;
(base )dee = 100;
dee.print();
dee.relase();
des(&dee);

输入结果会出现:
base::operator, val = 100
~base::val = 100
deiver::print(), val = 12345

为什么重载的dee对象立即被析构?
小弟不甚明白。。。  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题 2008-10-21 20:18 空明流转

slice会产生临时对象。  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题 2008-10-26 14:42 金山词霸2008

北京金山可能最清闲,总不组要负责广告和联盟业务。  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题 2009-08-24 00:40 bicheng.gui@gmail.com

@powerlang


deiver::~deiver
~base::val = 98765
这两个就是全局对象的析构啊!!注意val的值,是全局变量里的值。
楼主给的输出里忘记这两个析构函数了。

另外,有朋友说这两个析构函数是trivial的,实际上我认为,只要用户定义了析构函数,那么析构函数从编译器的角度来讲就不是trivial的了,此时编译器不为你生成析构函数。

另外,作为base class, 析构函数要声明为virtual。这是c++ FAQ list里的一条。  回复  更多评论   

# re: 金山2009校园招聘成都一笔试题[未登录] 2009-09-06 19:27 小强

会产生临时对象的  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理