错误
基类中的a()没有实现,或者声明为virtual

解决方案 »

  1.   

    没有问题,应该可以显示class CChild::a()
      

  2.   

    1, main 前应该用void,main()没有返回值。
    2,CBase 没有a()的实现函数,
       child.b() ---> CBase::b() 
                      this 指针为CBase -----> CBase::a()
      

  3.   

    错误1 main函数没有返回值
        2 CBase::a()没有定义
      

  4.   

    当然有问题了,
    1、child.b()后面没有分号;
    2、 CBase中的a()没有实现,重复定义
      

  5.   

    基类的a()没有实现,它不可能通过其子类来实现。如果要实现这样的想法,只有申明a()为虚拟函数。ATL的COM实现参考了这种实现
      

  6.   

    1.基类中的a()没有实现.
    2.由于基类中的a()不是声明为virtual,所以实际调用的是CBase::a().
      

  7.   

    同意: YangyiOfWh(阿一) 
      

  8.   

    应该把基类中a()定义为virtual a()=0;// 纯虚函数,让继承类只继承基类的接口
      

  9.   

    1. 基类中的a()没有实现
    2. 由于基类中的a()不是声明为virtual,所以实际调用的是CBase::a(). 
    3. 虽然在派生类中重载了a(),但因为在基类中的a()没有实现.还是出错
      

  10.   

    呵呵,大家还忽略了一个,当时我答题的时候,也忽略了 少了 #include<stdio.h> 啊
      

  11.   

    我觉得#inlcude不能用来作为考试的对象,
    从来没有什么PROGRAM考需要INCLUDE什么文件!如果需要,可以查询HELP获得调用的INCLUDE 文件。
    我想因该是考察时候重载的问题。
      

  12.   

    我觉得这道题目主要考你的好象是虚函数重载的概念。
    考你b()函数里到底调用的是那个a()函数
    至于a()函数没有实现好像不是什么大问题。
      

  13.   

    那最后调用的到底是CBase::a()还是CChild::a(),我有点头晕
    不过好像编译是一定会对的吧,就是所要求的功能可能不能实现
      

  14.   

    jyf7862(jyf):
    你说的不对,a()函数没有实现的话,连接会出错的,连接器找不到函数入口地址,怎么可能没有问题呢?这道题主要的问题就是a()函数没有实现。
    只有当a()声明为纯虚函数时,才可以连接通过。
    所以这道题有两个解:1。实现基类的a()
                       2.将基类的a()函数声明为纯虚函数,既virtual void a()==0;
      

  15.   

    主要问题是CBase::a()没实现
    改法有两种
    一。当然是,在CBase中实现a()啦,此时,main中会调用CChild:a()功能能实现;
    二。把CBase:a()声明为纯虚函数即virtual a()=0;还有, printf("class CChild::a()/n");
                                   ~~~~~  应该是\n啊
      

  16.   

    漏了,  声明为纯虚函数应该是 virtual void a()==0; 
    真大意!!
      

  17.   

    总结上述所有答案:本程序只有3个错(不管问题大小)
    1、CBase;;a()函数没有实现,应该加一个CBase::a(){...}
    2、int main()函数没有返回值,应该在main()中加上return 1(/0);
    3、main()函数最后一句child.b()少了分号,应该为child.b();至于CBase::a()函数要不要定义为虚拟函数,对本程序的对错没有影响(至少在目前功能未明的情况下)
      

  18.   

    漏了一条
    0、没有include <stdio.h> 
      

  19.   

    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?
      

  20.   

    我看真正意义上的“错误”只有一个:基类的a()未定义。
    关于child.b()后的分号以及\n还是/n的问题,说不定是heyijpn的笔误。这种问题如果真用来作为招聘软件人才的考点,未免太无聊了吧。
    include的问题似乎也不是问题,我记得在以前用TC写程序时,使用printf与scanf就不需要包含stdio.h。
    int main的返回值按照正确的做法,的确应该返回一个值。但在Borland的一些编译器里,即使不返回任何值,也不是错误,只是个警告而已。不过无论如何,还是应该写上返回值。把这点作为一个“错误”来看,我觉得也是合情合理的。
      

  21.   

    \n还是/n的问题是笔误。
    我看问题的关键在
    void CBase::b()
    {
    a();
    }
    不知大家意下如何?
      

  22.   

    a不声明为虚函数也可,只要define了就行
      

  23.   

    派生类中重载基类中的函数,则此函数必须是由virtual定义的,否则基类和派生类中的同名函数将没什么关系
      

  24.   

    void CBase::b()
    {
    a();
    }改为
    void CBase::b()
    {
    this.a();
    }就行了
      

  25.   

     我想诸如 #include 或者 \n 之类的问题可能非题者本意。
     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.  
     
      

  26.   

    CBase的a()是否定义成纯虚函数是有讲究的,得根据功能需要。
    如果定义成
    class CBase
    {
    public:
    void a(){printf("Base\n");}
    void b();
    };
    会调用基类函数输出 Base