首页 > 试题广场 >

下列代码的输出为:

[单选题]
下列代码的输出为:
#include<stdio.h>
class CParent {
    public: virtual void Intro(){
        printf( "I'm a Parent, " ); Hobby();
    }
    virtual void Hobby(){
        printf( "I like football!" );
    }
}; 
class CChild : public CParent { 
    public: virtual void Intro(){
        printf( "I'm a Child, " ); Hobby();
    }
    virtual void Hobby(){
       printf( "I like basketball!\n" );
    }
}; 
int main( void ){
    CChild *pChild = new CChild(); 
    CParent *pParent = (CParent *) pChild; 
    pParent->Intro(); 
    return(0);
}
  • I'm a Parent, I like football!
  • I'm a Parent, I like basketball!
  • I'm a Child, I like basketball!
  • I'm a Child, I like football!
推荐
输出:I’m a Child, I like basketball!
这题动态联编,Intro()和Hobby()都是虚函数且通过指针调用,基类指针会向派生类中寻找,找到后执行派生类的函数,所以输出的结果是I’m a Child, I like basketball!
编辑于 2015-01-28 16:24:34 回复(5)
(CParent *)这个要不要都没关系的。。。
发表于 2015-03-25 21:32:18 回复(0)
个人理解:
CParent *pParent = (CParent *) pChild; 
这个是上行转换,即把子类的引用或指针转换为基类表示。这个是安全的。
所以上面的语句的作用是把pChild指针转换为基类指针并赋值给pParent,但是它指向的内容是没变的,所以最终结果是pChild指针和pParent指针都指向了child类。
而且由于基类的方法都已经声明为了虚函数,所以最后pParent->Intro();根据虚函数表就是调用了child类里面的方法。
编辑于 2015-10-20 16:00:58 回复(0)
一个类如果定义了虚函数,则不管是类中还是类外,对这个函数的调用都是通过对象的虚函数表,所以Intro(){hobby()};相当于vptr[0](this*){this->vptr[1](this)},虚函数表的第一二项分别是Intro()和hobby()的地址,而且子类已经把这两个都重写了,所以调用的自然都是子类的函数。
发表于 2015-03-30 20:35:29 回复(3)
我认为只需要记住一个动态绑定的原则即可:
当指针指向基类对象时,调用的是基类中的虚函数。
当指针指向子类对象时,调用的是子类中的虚函数。
而满足动态绑定的条件如下:一是使用虚函数,二是使用指向基类的指针或者引用去调用虚函数。
这一题的对象指针指向的是子类的对象,自然调用的子类虚函数。
发表于 2020-10-13 12:59:41 回复(0)
CParent *pParent = (CParent *) pChild; 
容易引起误导,有没有 (CParent *)  ,意思一样,去掉之后,就是非常明显的多态性考核
发表于 2016-07-20 10:54:41 回复(0)
答案 C D中的一个

需要研究一下:

C++虚函数虚函数表解析 

发表于 2015-01-08 17:22:27 回复(1)
类型转换(parent*)不改变数据类型,pChild的虚函数指针又没有改变,所以还是调用的派生类的函数
发表于 2015-06-06 23:42:20 回复(0)
想知道这道题并没有调用Hobby,为什么会输出"I like basketball!\n"
发表于 2017-08-18 23:43:55 回复(1)
每一个虚函数对象对应一个虚表指针;
类和虚表对应,对象和虚表指针对应;
不管怎么转换,对象没变,对象对应的虚表指针就不变;
发表于 2017-02-28 18:50:42 回复(0)
多态有两种,一种为函数重载,一种为虚函数;本题主要考察虚函数,当基类对象指针指向派生类时,会调用派生类中的虚函数;当基类对象指针指向基类对象时,会调用基类虚函数
编辑于 2021-03-02 21:21:42 回复(0)
pParent是CParent 类,调用函数Intro()时,先调用基类的Intro(),但它是个虚函数,所以要调用派生类的Intro()函数。
发表于 2017-09-24 19:55:36 回复(0)
父类指针或引用指向子类对象,会调用子类的虚函数
发表于 2017-02-20 18:04:37 回复(0)
虚函数的作用是可以通过基类指针或引用 访问基类和派生类中的虚函数,从而实现动态关联。
如此,基指针指向哪个类的对象就调用哪个类的函数。选C。
如果不加virtual,就变成了静态关联.选A。
发表于 2015-10-29 20:36:40 回复(0)
正确答案:C
在基类pParent中加了Virtual关键字的函数就是虚拟函数,于是在pParent的派生类CChild中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类pParent的指针pParent指向派生类CChild的对象pChild时,对pChild的Intro()函数的调用实际上是调用了CChildIntro()函数而不是pParentIntro()函数。这是面向对象中的多态性的体现。
发表于 2014-12-29 17:09:59 回复(2)
无virtual看指针类型,有virtual看实际内容
发表于 2020-02-10 13:23:22 回复(0)
基类指针会向派生类中寻找,找到后执行派生类的函数
发表于 2021-12-23 15:52:02 回复(0)
printf("%x  %x",pChild,pParent);
这两个地址是一样的
发表于 2021-08-05 21:47:29 回复(0)
虽然pchild类型有变,但是一直指向派生类没有变
发表于 2020-12-14 18:02:33 回复(0)
先定义的子类指针,下面那个句子我的理解是把子类指针强制类型转换
发表于 2020-02-17 21:36:06 回复(0)
cclid的指向并没有改变
发表于 2019-11-26 10:08:45 回复(0)