C++ 多态 原理

来源:互联网 发布:淘宝童装批发市场 编辑:程序博客网 时间:2024/06/11 02:14

转载http://blog.csdn.net/zyq0335/article/details/7657465 部分内容

当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。而要让编译器采用迟绑定,就要在基类中声明函数时使用virtual关键字(注意,这是必须的,很多学员就是因为没有使用虚函数而写出很多错误的例子),这样的函数我们称为虚函数。一旦某个函数在基类中声明为virtual,那么在所有的派生类中该函数都是virtual,而不需要再显式地声明为virtual。

 

对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为本类的虚表。所以在程序中,不管你的对象类型如何转换,但该对象内部的虚表指针是固定的,所以呢,才能实现动态的对象函数调用,这就是C++多态性实现的原理。

    1、每一个类都有虚表。

    2、虚表可以继承,如果子类没有重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类3个虚函数,那么基类的虚表中就有三项(虚函数地址),派生类也会有虚表,至少有三项,如果重写了相应的虚函数,那么虚表中的地址就会改变,指向自身的虚函数实现。如果派生类有自己的虚函数,那么虚表中就会添加该项。

    3、派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。

/*一旦某个函数在基类中声明为virtual,那么在所有的派生类中该函数都是virtual,而不需要再显式地声明为virtual。class Animalclass Fish:public Animalclass GoldFish:public Fish  要让编译器采用迟绑定,就要在基类中声明函数时使用virtual关键字*/#include <iostream>using namespace std;class Animal{public:virtual void breath(){cout<< "animal breath !" << endl;}};class Fish:public Animal{public:void breath()  {cout<< "Fish bubble !" << endl;}};class GoldFish:public Fish{public:void breath(){cout<< "GoldFish bubble bubble !" << endl;}};int main(){GoldFish gf;Animal *pa=&gf;pa->breath();return 0;}


   虚函数

 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。

  纯虚函数

 引入原因:为了实现多态性,纯虚函数有点像java中的接口,自己不去实现过程,让继承他的子类去实现。

    在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。这时我们就将动物类定义成抽象类,也就是包含纯虚函数的类

    纯虚函数就是基类只定义了函数体,没有实现过程定义方法如下

 virtual void Eat() = 0; 直接=0 不要 在cpp中定义就可以了

虚函数和纯虚函数的区别

1虚函数中的函数是实现的哪怕是空实现,它的作用是这个函数在子类里面可以被重载,运行时动态绑定实现动态

纯虚函数是个接口,是个函数声明,在基类中不实现,要等到子类中去实现

2 虚函数在子类里可以不重载,但是纯虚函数必须在子类里去实现。


0 0