首页 > 试题广场 >

如下程序执行后的输出结果是()

[单选题]
如下程序执行后的输出结果是()
#include <iostream>
using namespace std;
class Base {
public:
    void fun1(){ cout<<"Base\n";}
    virtual void fun2() {cout<<"Basein";}
};
class Derived:public Base {
public:
    void fun1() {cout<<"Derived\n";}
    void fun2() {cout<<"Derived\n";};
};
void f(Base& b) {
    b.fun1();
    b.fun2();
}
int main() {
    Derived obj;
    f(obj);
}
	


  • Base Base
  • Derived Derived
  • Derived Base
  • Base Derived
基本的多态考察。
发表于 2016-12-09 09:48:04 回复(0)
答案应该是D。   对于父类函数( virtual 、非 virtual ),如果有同型函数:
----非virtual函数由指针类型决定调用哪个 「即 f(Base &b)  , 指针类型为Base」
----virtual函数由指针指向的对象决定调用哪个(运行时决定)「即 Derive obj;   , 指针指向对象为Derive」
可参看: http://www.cppblog.com/liyuxia713/archive/2010/01/08/105170.html
发表于 2016-12-23 09:47:50 回复(0)
D。
这属于多态的内容。用父类指针指向子类对象时,在父类的成员函数前加virtual,调用时调用的才是子类本身的那个成员函数,否则调用的还是父类的成员函数。

发表于 2017-03-14 16:59:34 回复(1)
非虚函数由指针决定调用哪个(&) 虚函数由定义时指向的对象决定调用哪个(定义是派生类drived)
发表于 2017-08-22 21:06:12 回复(0)
一帮复制粘贴的垃圾 这是基类引用引发的多态 跟基类指针一样的效果
发表于 2021-01-29 09:37:00 回复(1)
于父类函数(virtual、非virtual),如果有同型函数: 非virtual函数由指针类型决定调用哪个  virtual函数由指针指向的对象决定调用哪个(运行时决定)
发表于 2018-03-11 23:02:09 回复(0)
引用和指针都能实现多态
发表于 2022-04-01 15:48:35 回复(0)
淦泥酿拉
发表于 2020-12-02 13:49:33 回复(0)
定义父类指针指向子类对象,调用父类成员函数,如果父类成员函数是虚函数则调用子类成员函数。 构造函数调用顺序:虚父类构造函数、父类构造函数、自身构造函数 析构函数调用顺序:自身析构函数、父类析构函数、虚父类析构函数
发表于 2020-10-10 22:31:20 回复(0)

父类和子类有同名函数,调用同名函数时,调用父类的非虚函数,和子类的虚函数

发表于 2018-06-27 09:58:14 回复(0)
这属于多态的内容。用父类指针指向子类对象时,在父类的成员函数前加virtual,调用时调用的才是子类本身的那个成员函数,否则调用的还是父类的成员函数。
发表于 2018-05-15 21:13:58 回复(0)

想要看具体操作函数实现,看一楼的博客吧。但是注意第2点。

(1)如果对于父类函数(virtual/非virtual),如果子类没有同名函数,则正常继承。

也就是如果你所调用的是fun1()这个函数,在父类中有,子类中没有,无论你所选择定义的指针或变量是父类的还是子类的,最终调用的都是父类。

而当然如果父类没有子类有的话,定义的时候只能定义子类的去调用,而父类中不存在该函数自然不能调用了。

(2)对于父类函数(virtual、非virutal),子类有同名函数,函数类型不同,则父类函数和子类函数都不能调用

对于函数名相同但参数类型不同且都是不带virtual的情况,当时是所用什么类去定义,所调用的函数的参数要与那个类里面的参数对应,不然就调用不了。比如在父类中有,func(int i);  ,在子类中有,func(),你要定义子类类型的变量或指针去调用func(1),很明显是根本调用不了的,因为子类中没有这个参数类型的函数。反之,子类和父类这两个词调换一下看,也调用不了。

同名但是参数类型不同,如果在父类中是带virtual的函数,而在子类中是不带的,你定义的子类类型的变量或指针,去调用该父类中这个带virtual的函数(参数类型也是父类中该函数参数类型),那就不能调用。因为参数类型在子类中不存在,直接就不能调用,跟是不是virtual无关。

只要你同名但函数参数类型不同,你所定义的一个类的变量或指针,去调用另一个类中的函数,都是直接不能调用的,不论你是不是带virtual。
(3)对于父类函数(virtual、非virtual),如果有同名同型函数(参数类型相同)

当对于同名参数类型相同的函数,而在父类中该函数前是有virtual,而子类中的同函数名且同参的函数前却是不带virtual,无论所定义的类型是父类类型还是子类类型,该变量或指针所调用该函数都是子类中的。

而同名参数相同情况下,子类中该函数前是有virtual,而父类中没有的话,用父类定义去调用该函数,这时就会崩溃,而子类也同样去调用,但是子类并不会崩溃。(单独分开去定义父类的和子类的变量或指针去调用就能知道是定义父类变量或指针调用函数的时候出现的问题)

如果函数名相同和参数类型也相同,都是带virtual的,那会崩溃,因为是由于父类所引起的崩溃而崩溃。

而如果函数名相同和参数类型也相同,都是不带virtual的,当你调用函数时,那就是你所定义的变量或指针是什么类(父类或子类)的,那它就相对应调用的就是哪个类中的函数。

编辑于 2019-08-23 01:48:19 回复(0)
当使用类的指针调用成员函数时,普通函数由指针类型决定,而虚函数由指针指向的实际类型决定
发表于 2023-11-22 20:05:25 回复(0)
考点是覆盖,virtual虚函数调用子类函数覆盖所以输出子类函数内容
发表于 2023-08-29 20:49:49 回复(0)
多态。
用父类指针指向子类对象时,在父类的成员函数前加virtual,调用时调用的仍是子类本身的成员函数。
否贼调用的还是父类的成员函数
发表于 2022-06-18 18:29:19 回复(0)

额;这是传的基类指针吗

发表于 2020-03-30 21:17:33 回复(2)

覆盖了

发表于 2019-11-27 18:47:29 回复(0)
考察什么知识点都不清楚
发表于 2019-07-22 21:00:24 回复(0)

D。

这属于多态的内容。用父类指针指向子类对象时,在父类的成员函数前加virtual,调用时调用的才是子类本身的那个成员函数,否则调用的还是父类的成员函数。



发表于 2018-10-15 00:24:12 回复(0)