question:void a(void) { goto labelb; } void b(void) { labelb: ...} question: 1.In C language whether there is this kind of goto; 2.If not,how to implement it with a kind of C's service?
我看真正意义上的“错误”只有一个:基类的a()未定义。 关于child.b()后的分号以及\n还是/n的问题,说不定是heyijpn的笔误。这种问题如果真用来作为招聘软件人才的考点,未免太无聊了吧。 include的问题似乎也不是问题,我记得在以前用TC写程序时,使用printf与scanf就不需要包含stdio.h。 int main的返回值按照正确的做法,的确应该返回一个值。但在Borland的一些编译器里,即使不返回任何值,也不是错误,只是个警告而已。不过无论如何,还是应该写上返回值。把这点作为一个“错误”来看,我觉得也是合情合理的。
2,CBase 没有a()的实现函数,
child.b() ---> CBase::b()
this 指针为CBase -----> CBase::a()
2 CBase::a()没有定义
1、child.b()后面没有分号;
2、 CBase中的a()没有实现,重复定义
2.由于基类中的a()不是声明为virtual,所以实际调用的是CBase::a().
2. 由于基类中的a()不是声明为virtual,所以实际调用的是CBase::a().
3. 虽然在派生类中重载了a(),但因为在基类中的a()没有实现.还是出错
从来没有什么PROGRAM考需要INCLUDE什么文件!如果需要,可以查询HELP获得调用的INCLUDE 文件。
我想因该是考察时候重载的问题。
考你b()函数里到底调用的是那个a()函数
至于a()函数没有实现好像不是什么大问题。
不过好像编译是一定会对的吧,就是所要求的功能可能不能实现
你说的不对,a()函数没有实现的话,连接会出错的,连接器找不到函数入口地址,怎么可能没有问题呢?这道题主要的问题就是a()函数没有实现。
只有当a()声明为纯虚函数时,才可以连接通过。
所以这道题有两个解:1。实现基类的a()
2.将基类的a()函数声明为纯虚函数,既virtual void a()==0;
改法有两种
一。当然是,在CBase中实现a()啦,此时,main中会调用CChild:a()功能能实现;
二。把CBase:a()声明为纯虚函数即virtual a()=0;还有, printf("class CChild::a()/n");
~~~~~ 应该是\n啊
真大意!!
1、CBase;;a()函数没有实现,应该加一个CBase::a(){...}
2、int main()函数没有返回值,应该在main()中加上return 1(/0);
3、main()函数最后一句child.b()少了分号,应该为child.b();至于CBase::a()函数要不要定义为虚拟函数,对本程序的对错没有影响(至少在目前功能未明的情况下)
0、没有include <stdio.h>
{
goto labelb;
}
void b(void)
{
labelb:
...}
question:
1.In C language whether there is this kind of goto;
2.If not,how to implement it with a kind of C's service?
关于child.b()后的分号以及\n还是/n的问题,说不定是heyijpn的笔误。这种问题如果真用来作为招聘软件人才的考点,未免太无聊了吧。
include的问题似乎也不是问题,我记得在以前用TC写程序时,使用printf与scanf就不需要包含stdio.h。
int main的返回值按照正确的做法,的确应该返回一个值。但在Borland的一些编译器里,即使不返回任何值,也不是错误,只是个警告而已。不过无论如何,还是应该写上返回值。把这点作为一个“错误”来看,我觉得也是合情合理的。
我看问题的关键在
void CBase::b()
{
a();
}
不知大家意下如何?
{
a();
}改为
void CBase::b()
{
this.a();
}就行了
Congy 说的有道理,解决方法也是对的,但是也许研究一下题者的本意和症结所在
似乎更有价值。题目本意似乎是 --- 如何延迟基类方法的实现到子类中。
这一点由解决方法体现了出来 "virtual void a() = 0", 当 compiler 编译 CBase::b()
之时,它仅仅是通过a()的函数指针在 VTable 中的偏移来调用a()的,由于a() is a pure
virtual function,此时VTable中的CBase::*a() 是无效的。 当编译完成,linker 开始
用函数实现的地址填写 VTable 时,CChild::a() 必须是实现的, 否则会 Throw A Link
Error, CChild::a() is implemented 所以链接正常。
至于a()的重定义问题, 我想题者也没有料到误导了试者,"重定义" 的妙处在于
我们只需要改正一处即可: "virtual void a() = 0", virtual function 的子类实现
毕竟也需要 declaration 的。 附加的好处还有一点是 CBase can not be instantiated
so it really forces the delay implementation in derived class.
如果定义成
class CBase
{
public:
void a(){printf("Base\n");}
void b();
};
会调用基类函数输出 Base