首页 > 试题广场 >

写出下面程序的输出结果

[单选题]
写出下面程序的输出结果
class A
{
public:
 void FuncA()
 {
     printf( "FuncA called\n" );
 }
 virtual void FuncB()
 {
     printf( "FuncB called\n" );
 }
};
class B : public A
{
public:
 void FuncA()
 {
     A::FuncA();
     printf( "FuncAB called\n" );
 }
 virtual void FuncB()
 {
     printf( "FuncBB called\n" );
 }
};
void main( void )
{
 B	b;
 A	*pa;
 pa = &b;
 A *pa2 = new A;
 pa->FuncA(); ( 3) 
 pa->FuncB(); ( 4)
 pa2->FuncA(); ( 5)
 pa2->FuncB();
 delete pa2;
}

  • FuncA called
    FuncB called
    FuncA called
    FuncB called
  • FuncA called
    FuncBB called
    FuncA called
    FuncB called
  • FuncA called
    FuncBB called
    FuncAB called
    FuncBB called
  • FuncAB called
    FuncBB called
    FuncA called
    FuncB called
推荐
选B
 B  b; 
 A  *pa;
 pa = &b;
 A *pa2 = newA;
 pa->FuncA(); ( 3)//pa=&b动态绑定但是FuncA不是虚函数,所以FuncA called
 pa->FuncB(); ( 4)//FuncB是虚函数所以调用B中FuncB,FuncBB called  
 pa2->FuncA(); ( 5)//pa2是A类指针,不涉及虚函数,调用的都是A中函数,所以FuncA called FuncB called
 pa2->FuncB()
编辑于 2015-12-21 09:45:19 回复(11)
C++primer p479:只有虚函数的成员函数才进行动态绑定,成员函数认为非虚函数,非虚函数不进行动态绑定
发表于 2015-11-04 20:47:17 回复(0)
这答案有问题
发表于 2018-08-10 16:21:43 回复(0)
实现多态的三个条件:
1、要有继承
2、虚函数重写
3、父类指针(引用)指向子类对象
同时满足以上条件才可以实现多态
发表于 2017-06-26 21:00:40 回复(0)
B b; A *pa; pa = &b;//父类的指针或者引用都可以指向或引用子类,发生动态绑定,只对虚函数
发表于 2017-03-10 08:48:15 回复(0)
本题考查知识点:父类指针指向子类实例对象,调用普通重写方法时,会调用父类中的方法。而调用被子类重写虚函数时,会调用子类中的方法。
再次说明了,子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类实例对象本身有关。

编辑于 2015-03-29 09:05:12 回复(1)
关于第一条输出语句。这条语句具有迷惑性,虽然用基类指针指向子类对象,但是,动态绑定所适用的函数必须是虚函数。而该语句调用的是普通函数,虽然子类重写了并且可能将父类的同名函数隐藏,但是由于是使用基类指针,仍然会调用基类的那个普通函数。
发表于 2016-11-17 11:46:06 回复(0)

1.b.FuncA();输出

FuncA called

FuncAB called

2.b.FuncB();输出

FuncBB called

上两者好理解,直接调用类B的相应成员函数

3.pa->FuncA();输出

FuncA called调用类A的FuncA()

4.pa->FuncB();输出

FuncBB called调用类B的FuncB(),原因是C++的动态决议机制,当基类函数声明为virtual时,指向派生

类对象的基类指针来调用该函数会选择派生类的实现,除非派生类没有才调用基类的虚函数。还有一点注

意的是:指向基类类型的指针可以指向基类对象也可以指向派生类对象,如pa=&b;

5. pa2->FuncA();

pa2->FuncB();输出

FuncA called

FuncB called

这也好理解,直接调用类A的相应成员函数

发表于 2014-10-25 00:26:17 回复(2)
pa2是A类的实例。virtual关键字实现多态,函数重写只可能发生在父类和子类之间,被重写的虚函数可表现出多态特性,
pa2->FuncA();这只是在父类(A类)里面,所以不存在多态特性。输出FuncA called\n。
pa2->FuncB();同上,输出FuncB called\n
pa = &b;基类的指针pa指向了子类的对象,如果是虚函数,会有多态特性,会调用子类定义的重写函数,所以,
 pa->FuncA(); 不是虚函数,没有多态,输出FuncA called\n
 pa->FuncB();B类中,有虚函数,输出子类中定义的重写函数,FuncBB called\n
所以选B。刚开始学,我的理解对吧?
发表于 2017-05-12 15:25:57 回复(2)
虚函数是c++实现多态的手段,具体指的就是如果派生类中的方法为虚时,基类指针可以根据其指向的具体对象的类型而绝对调用哪个函数。如果方法不为虚,则用指针调用方法和直接用对象调用是没有区别的,基类指针必然调用基类方法,而派生类指针必然调用派生类方法。在题目中pa是基类指针指向了派生类,所以在调用方法时如果调用了虚方法,则会根据指针指向的是基类或者派生类而正确调用,但如果指向了非虚方法,则必然会调用基类的方法,因为指针是基类指针。pa2是基类指针指向基类对象,显然必然调用基类的方法。另外题目还有没有考察到题干的地方就是派生类中的funcA被重写了。虽然题目没有考到,但是大家可以去搜一下override,overload,overwrite之间的区别。
发表于 2018-03-18 19:44:32 回复(0)
有关于C++动态绑定和静态绑定可以参考:
http://blog.csdn.net/sinat_33718563/article/details/72859494
(全部复制链接转到)
一般情况下,只有虚函数才使用的是动态绑定,其他的全部是静态绑定。
父类指针指向子类实例对象,调用普通重写方法时,会调用父类中的方法。而调用被子类重写虚函数时,会调用子类中的方法。
说明了子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类实例对象本身有关。
编辑于 2017-06-04 16:13:20 回复(0)
父类指针指向子类对象时,如果是普通的重写函数,调用父类的函数,但是是虚函数则 情况相反
发表于 2019-06-06 14:11:34 回复(0)
虚函数指谁找谁,不虚的从那继承来的找谁
发表于 2020-03-05 09:12:36 回复(0)
p2是A类的实例。。。怎么会调用虚函数呢。。
发表于 2016-11-08 19:45:28 回复(0)
题考查知识点:父类指针指向子类实例对象,调用普通重写方法时,会调用父类中的方法。而调用被子类重写虚函数时,会调用子类中的方法。
再次说明了,子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类实例对象本身有关

关于第一条输出语句。这条语句具有迷惑性,虽然用基类指针指向子类对象,但是,动态绑定所适用的函数必须是虚函数。而该语句调用的是普通函数,虽然子类重写了并且可能将父类的同名函数隐藏,但是由于是使用基类指针,仍然会调用基类的那个普通函数。

发表于 2020-05-24 10:54:57 回复(0)
子类动态绑定
发表于 2020-04-11 16:08:42 回复(0)
知识点掌握不牢固,审题不认真,虚函数才会找到真正的执行者,如果不是虚函数,则调用形式上的函数
发表于 2020-04-03 23:28:40 回复(0)
 B  b;
 A  *pa;
 pa = &b;
 A *pa2 = newA;
 pa->FuncA(); ( 3)定义虚函数后,基类的指针才来调用子类的函数。
发表于 2018-09-02 20:48:11 回复(0)
没有少一个输出吗
发表于 2018-03-18 10:06:03 回复(0)
很基本的c++多态性的考察
发表于 2018-03-12 11:45:29 回复(0)
嗯,首先,指针本身的类型是A,那么他调用成员函数的时候回找类型指向的函数,而对于虚函数,他在类内有实际的地址,那么地址是B的地址,则会找到B类内实现的虚函数。
发表于 2017-10-24 13:10:08 回复(0)