C++读程序写结果题,请说明调用 顺序以及原因。
这个题考查的知识点不少,主要的有三点,一是类的继承,虚函数的覆盖,二是构造函数的调用,三是多态。
先说结果: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
多谢啦