C++读程序写结果题,请说明调用 顺序以及原因。

2025-05-20 03:03:01
推荐回答(1个)
回答1:

这个题考查的知识点不少,主要的有三点,一是类的继承,虚函数的覆盖,二是构造函数的调用,三是多态。

先说结果:2213

原因:

先说明一下上面提到的三个知识点,一、ONE作为基类有一个虚函数f(),TWO继承了ONE且没有重定义f(),那么TWO中其实有一个与ONE一样的f()函数,THREE继承TWO且重定义了f()函数即覆盖了TWO中的f()函数。那么在调用这两个类的f()函数时,ONE和TWO调用的都是ONE中的f(),而THREE调用时调用的是自己类的定义的f()函数。二构造函数的调用,当创建一个子类的时候必先调用基类的构造函数。三、基类指针可以指向子类对象,当调用虚函数时就触发了多态,即实际是哪个类的对象调用的就是哪个类中定义的函数,若未定义则调用基类的同名函数。

解题:

main()函数

第一行:定义一个ONE的指针p,没有指向任何有效空间,是一个无效指针,不调用任何构造函数

第二行:定义一个TWO的对象bb,此时会先调用ONE的构造函数(啥也没有),再调用TWO的默认构造函数,会打印2

第三行:定义一个THREE对象cc,会先调ONE的构造函数,再调用TWO的构造 函数,打印2,再调用THREE的构造函数

第四行:指针p指向THREE的对象cc的地址,是基类指针指向子类对象,在访问p时可触发多态

第五行:调用p指向对象的f()函数,即调用THREE中定义的f()函数,该函数中先调用了TWO中的f()函数,TWO中没有重定义所以调用ONE的f()函数打印1,再打印3

最终结果就是2213