上一文章讲了继承,继承中向上转换的特性,可以将派生类对象作为基类对象来处理。因此不同的派生类(派生于同一基类)都可以看作一个对象,使基类的一些代码可以作用在不同的类上。
虚函数的目的是什么?
虚函数主要是为了表达不同派生类之间的区别,这句话听起来还是抽象,后面见代码。
1.函数调用与捆绑把函数体与函数调用相联系,被称为捆绑。
在程序运行之前,函数与函数调用的捆绑发生,为早捆绑。
在程序运行之中,函数与函数调用发生的捆绑,为晚捆绑,或运行中捆绑。也就是编译器在运行中,需要知道运行时对象正确的类型,并调用正确函数。
比如向上类型转移,这时编译器需要知道实际引用和指针指向实际类型,是基类还是派生类。
2.虚函数--重写c++ 为了晚捆绑,引入了一个新的关键字。virtual。
virtual 指向的函数被称为虚函数。这里可不是空虚的虚。
重新说一下向上强制转移的概念吧。
#include#include #include using namespace std; class A { public: void hellow(){cout<<"hellow: 运行结果:
hellow:<
hellow:<
这里 我们创建了B和C,转化成A指针, ptr_a 实际调用的是A 的hellow函数。
为什么不能调用B和C 的hellow函数?
ptr_a 是A 类型的指针,指向B和C 对象,如何能够调用B和C 重写的函数呢?
答案就是虚函数。
#include#include #include using namespace std; class A { public: virtual void hellow(){cout<<"hellow: 运行:
hellow:< hellow:<
这里将基类的函数声明为虚函数。
即使将派生类对象 ---向上转换---,也能调用派生类重写的基类函数。这一特性在c++编程中特别的重要。
这可以增加程序的可扩展性。
#include#include #include using namespace std; class A { public: virtual void hellow(){cout<<"hellow: 运行结果
hellow:< hellow:< hellow:<
这样增加了程序的扩展性,比如hellow 函数,指向基类和派生类对象,可以执行不同函数调用。
当我们封装了一些模块,即使派生新的类型,增加不同的实现形式,可以是代码运行正常。



