C++ 虚函数、虚函数表、纯虚函数、虚基类---之比较总结
1>虚函数virtual
虚函数为了实现多态继承,要求同样的方法(函数名、特征标都要相同,但返回类型是类指针或引用时,可以不同,上一篇博文
《C++ 派生类虚函数定义---注意事项》中有讲解)在基类和派生类中表现不同
在基类中声明的虚方法,应该有定义,定义不能少
在派生类中,基类声明的虚方法,可以定义(在与基类定义的虚方法表现不同时),若与基类定义的虚方法表现相同,则可以不定义。(与纯虚函数的要求正好相反!!!)
2>纯虚函数
纯虚函数主要是为了设置接口规范,要求基类必须要实现的接口,也即接口约定
例如:工厂A生产的插座,有三个插口,工厂B要生产插销,用的都是工厂A的插座,
此时工厂B在设计插销时,可以有很多样式(方形的,圆形的。。。),但必须要有三个插头(实现的方法也可以有很多种:铜制插头、银质插头。。。,即多态),这就是接口约定,
纯虚函数,基类要求派生类必须要实现的方法,但在基类中可以不实现
至少包含一个纯虚函数的类为抽象基类(ABC)
呈上与虚函数比较:
在基类中声明的纯虚函数一般不需要有定义(当然不反对它定义)
在派生类中,基类中声明的纯虚函数,一定要有定义
3>虚函数表
每一个对象,都有一个隐藏的数据成员,该成员是一个指针,该指针指向一个数组,数组中的元素是函数指针,此处的函数就是对象中的虚函数
每一个对象都有一个属于自己的虚函数表,记录本对象中的虚函数的地址
基类对象有一个虚函数表
派生类对象也有一个虚函数表(若派生类没有重新定义基类中的某个虚函数,则此虚函数的地址在派生类虚函数表中的值与在基类中该虚函数的地址值相同,否则,不同)
4>虚基类
多重继承中,两个类继承自同一个类,即两个类的基类相同,此时,这个基类若是虚基类,则
由这两个类多重派生来的类,只继承一个基类的基类