向上转型后,父类对象.方法 为什么不调用本类即父类方法,而调用子类覆写的方法呢?不是舍近求远吗?

2024-10-31 05:37:24
推荐回答(1个)
回答1:

首先,从意义上讲,父类一般表示较抽象的概念,而子类表示更具体的概念。一旦你创建子类的实例,就表示你已经了解了它的具体特性,即便你向上转型,也只是表示你暂时不关注具体的特性,但这个实例仍然是具体化的。就好比你管理一家公司, 你一开始为所有员工制定了某项规章制度,后来发现A部门比较特殊,给他们另行制定了这项规章,这就相当于你为“员工”这个父类派生了“A部门员工”这个子类,并覆写了执行该规章的方法。现在你要号召该所有员工去执行该规章,你会向他们统一发号施令,但是A部门员工默认情况下仍然会按照你为他们制定的特别规章来实施,除非你刻意强调他们也按一般规章。 其次,在程序正确性的保证上,父类可以是一个抽象类,它的某个方法是虚函数,并没有给出实现,该方法在子类里才被实现。这个时候,你把一个子类向上转型再调用这个函数,如果去调用父类方法的话,程序就会面对这个没有被实现的虚函数而无法执行。所以,仍然要调用子类覆写的方法。 最后,从实现角度讲,向上转型之后,只不过改变了指针或者对象引用的类型,但它们所指向的内存中的实际对象的类型并没有改变,依然是子类的类型,所以调用方法仍然会是子类的。