[本篇全文] [回复本文] [本篇作者: pennyliang] [本篇人气: 123] 0
发信人: pennyliang (世界很美好,值得去奋斗), 信区: CPlusPlus
标 题: 一句话说出下列代码执行结果,热身系列2
发信站: 南京大学小百合站 (Thu Nov 9 14:22:04 2006)
class A
{
virtual void test(char* s)
{
printf("A:the str is s%",s);
}
A(char* s)
{
test(s);
}
}
class B:public A
{
virtual void test(char* s)
{
printf("B:the str is s%",s);
}
B(char *s):A(s)
{
}
}
void main(void)
{
B test("test");
}
给出结果,并说明原因
--
※ 来源:.南京大学小百合站 http://bbs.nju.edu.cn [FROM: 202.106.180.62]
[本篇全文] [回复本文] [本篇作者: wxy101] [本篇人气: 39] 1
发信人: wxy101 (【风起西南·巴渝人家】), 信区: CPlusPlus
标 题: Re: 一句话说出下列代码执行结果,热身系列2
发信站: 南京大学小百合站 (Thu Nov 9 16:15:15 2006)
A:the str is test.
调用A的构造函数时,B还没构造完成.所以不可能调用B的test函数,即使是virtual.
菜鸟想法,不知道对不?
--
※ 来源:.南京大学小百合站 http://bbs.nju.edu.cn [FROM: 218.94.9.35]
[本篇全文] [回复本文] [本篇作者: pennyliang] [本篇人气: 37] 2
发信人: pennyliang (世界很美好,值得去奋斗), 信区: CPlusPlus
标 题: Re: 一句话说出下列代码执行结果,热身系列2
发信站: 南京大学小百合站 (Thu Nov 9 16:17:57 2006)
回答正确,你觉得这个问题怎么改可以实现调用到B呢,而且我不希望增加一个类成员变量
来保留s,也就是在构造的时候就要输出 B的这一串数呢?
--
※ 来源:.南京大学小百合站 http://bbs.nju.edu.cn [FROM: 202.106.180.62]
[本篇全文] [回复本文] [本篇作者: wxy101] [本篇人气: 34] 3
发信人: wxy101 (【风起西南·巴渝人家】), 信区: CPlusPlus
标 题: Re: 一句话说出下列代码执行结果,热身系列2
发信站: 南京大学小百合站 (Thu Nov 9 16:32:52 2006)
给A提供一个空的默认构造函数,
B的构造函数就不要用初始化列表了,
在B的构造函数体内调用?
--
※ 来源:.南京大学小百合站 http://bbs.nju.edu.cn [FROM: 218.94.9.35]
[本篇全文] [回复本文] [本篇作者: pennyliang] [本篇人气: 36] 4
发信人: pennyliang (世界很美好,值得去奋斗), 信区: CPlusPlus
标 题: Re: 一句话说出下列代码执行结果,热身系列2
发信站: 南京大学小百合站 (Thu Nov 9 16:41:38 2006)
你已经答对了,我再总结一下
通常在构造函数调用虚函数,是很危险的,原因和你说的一样,在其作基类被构造的时候
,由于子类还没有构造完,基类没法反调到子类的代码上去。
如果一定要在构造的时候完成这种反调,就只能在基类把构造函数改为一个普通虚函数,
然后子类实现这个虚函数,在子类构造函数中主动调用这个虚函数,于是就调用子类的这
个函数了。
在我们应用template模式或者也有说是algroithm skeleton模式的时候,最容易犯这种错
误,有些时候是致命的,特别是如果子类和基类做很相似的工作的时候,排错都非常困难
。