金山2009校园招聘成都一笔试题 http://www.cppblog.com/expter/archive/2008/10/20/64518.html
1
# include <iostream>
2
using
namespace std;
3
4
class
base
5
{
6
public:
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
}
36
protected:
37
int val;
38
};
39
40
class deiver:
public
base
41
{
42
public:
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
};
72
void des(
base * b)
73
{
74
b->print();
75
b->relase();
76
}
77
deiver de = 98765;
78
int main()
79
{
80
deiver * dee = new deiver;
81
*(base *)dee = 100;
82
des(dee);
83
84
return 0;
85
}
86
# include <iostream>
2
using
namespace std;
3
4
class
base
5
{6
public: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
}36
protected:37
int val;38
};
39
40
class deiver:
public
base
41
{42
public: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
};
72
void des(
base * b)
73
{74
b->print();75
b->relase();76
}
77
deiver de = 98765;
78
int 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 阅读(3348) 评论(10) 编辑 收藏引用 所属分类: 面试笔记
本文解析了金山2009年校园招聘成都站的一道笔试题,涉及C++中构造函数调用顺序、虚函数、运算符重载等知识点,并给出了一段示例代码及运行结果。
1万+

被折叠的 条评论
为什么被折叠?



