C++热身系列二[原创于百合]

来源:互联网 发布:java字符编码 编辑:程序博客网 时间:2024/04/30 04:17
 
[本篇全文] [回复本文] [本篇作者: 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模式的时候,最容易犯这种错
误,有些时候是致命的,特别是如果子类和基类做很相似的工作的时候,排错都非常困难


 
原创粉丝点击