首页 > 试题广场 >

阅读下面代码: class B { public:

[单选题]
阅读下面代码:
class B
{
public:
   virtual void Fun(){}
};
class D: public B
{
public:
   void Fun(){}
};
D dd;
B* pb = ⅆ
D* pd = ⅆ
pb->Fun();
pd->Fun();
上述例程调用的Fun函数顺序为()
  • B::Fun, D::Fun
  • B::Fun, B::Fun
  • D::Fun, D::Fun
  • D::Fun, B::Fun
这个题目出的好!
本题考察两个知识点:
一、赋值兼容:
        1.子类对象可以赋值给父类对象
        2.子类对象可以初始化父类对象
        3.父类指针可以指向子类对象
        4.父类引用可以引用子类对象
二、子类重写父类 

这两个知识点也就是解释多态的关键

本题中,根据兼容性原则:当父类指针(引用)指向子类对象时,子类对象退化成父类对象,只能访问父类中定义的成员
如果B对象没有virtual修饰的话,B* pb = ⅆ dd就会退化为父类对象,pd就只能访问父类的成员B::Fun()
但是又virtual修饰的话,就会展现多态行为,会根据实际指针指向的对象判断函数的调用。pb 和pd都指向子类对象,所以调用D::Fun()






发表于 2018-08-10 14:17:54 回复(3)
基类B定义一个虚函数Fun,派生类D继承基类并对Fun函数进行了覆盖,因此基类指针调用派生类函数Fun,返回的是派生类的函数
发表于 2017-12-15 17:26:12 回复(0)
给指针赋值哪一个类的地址,就输出哪一个类的函数
发表于 2018-08-08 16:44:20 回复(4)
构成多态的两个条件是:
1、调用函数的对象必须是指针或是引用
2、被调的函数必须是虚函数,且完成了虚函数的重写
构成虚函数重写的条件是:
1、父类和子类的函数的函数名,参数,返回值都相同
2、有关键字virtual,但是若父类写了关键字virtual子类没写,也构成重写,但是这是不规范的重写行为

这里我们可以知道Fun()函数构成了多态,构成多态后调用那个类中的Fun()函数取决于对象
pb是一个指向子类的父类指针,
pd是一个指向子类的子类指针,
因此用pb和pd指向的都是子类对象,因此调Fun()函数调用的都是D中的Fun()函数
编辑于 2019-03-22 10:56:21 回复(0)
子类中的父类虚函数的同名同参函数貌似会隐式声明为virtual
所以这题就是多态中父类指针指向派生类对象的动态绑定问题。
编辑于 2019-07-26 20:11:22 回复(0)
用父类指针指向子类对象时,在父类成员函数前如果有virtual 调用的就是子类的成员函数 如果父类的成员函数前没有加virtual 就是调用父类的成员函数 (上面这种情况不论子类的成员函数加不加virtual都是成立的) 我是这么理解的,欢迎指正
编辑于 2017-11-01 18:21:29 回复(2)
**耶,这题都能做错🙄
发表于 2018-04-20 23:27:14 回复(0)
这题有错吧、应该是c
发表于 2017-09-07 19:28:06 回复(1)
这个题目出的好!
本题考察两个知识点:
一、赋值兼容:
        1.子类对象可以赋值给父类对象
        2.子类对象可以初始化父类对象
        3.父类指针可以指向子类对象
        4.父类引用可以引用子类对象
二、子类重写父类 

这两个知识点也就是解释多态的关键

本题中,根据兼容性原则:当父类指针(引用)指向子类对象时,子类对象退化成父类对象,只能访问父类中定义的成员
如果B对象没有virtual修饰的话,B* pb = ⅆ dd就会退化为父类对象,pd就只能访问父类的成员B::Fun()
但是又virtual修饰的话,就会展现多态行为,会根据实际指针指向的对象判断函数的调用。pb 和pd都指向子类对象,所以调用D::Fun()
发表于 2022-02-14 09:13:04 回复(0)
父类指针指向子类实例对象,调用普通重写函数时,会调用父类中的函数。而调用被子类重写虚函数时,会调用子类中的函数。
再次说明了,子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类实例对象本身有关。
发表于 2021-06-29 19:03:12 回复(0)
如果没有virtual子类对象退化为父类对象
发表于 2021-03-20 20:23:14 回复(0)
每次看到这些都晕晕乎乎的,简单粗暴下,指针赋值哪一类的地址,就输出哪一类
发表于 2019-04-09 16:52:16 回复(0)
这个题父类和子类的Fun函数构成了多态,因为父类的Fun函数前面有virtual,子类继承父类的时候,virtual会隐式继承,所以两个Fun函数构成重写 并且pb和pd都指向子类对象dd,这个时候去调用Fun函数就是谁去调就会去调谁的,也就是都是子类对象去调那调的就都是子类的Fun函数 所以答案就是D::Fun,D::Fun
编辑于 2019-03-22 09:20:35 回复(0)
C
发表于 2017-10-18 22:19:56 回复(2)
第一个产生了多态(多态三个条件)
第二个正常的对象调用
发表于 2017-09-06 10:06:50 回复(0)