虚函数:
简单讲即实现多态,基类定义了虚函数,子类可以重写该函数,通过虚函数表调用该函数。
每一个含有虚函数(无论该虚函数是本身,还是继承而来的)类,都有一个对应的虚函数表。
表中存放着该类所有虚函数对应的函数指针。如
其中:
vptr:每个对象有一个vptr指针,指向虚函数表。Vptr的设定和重置都是由一个类的构造函数,析构函数和拷贝赋值运算符自动完成。
B的虚函数表中存放有B::foo和B::bar两个函数指针。
D的虚函数即存放有继承自B额虚函数B:foo,又有重写的虚函数D::bar,还有新增的虚函数D::quz
reference:
https://www.cnblogs.com/malecrab/p/5572730.html
纯虚函数:
基类中不对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给基类的派生类去做。
即虚函数为子类提供了可被改写的接口。虚函数定义如下:
class <类名>
{
virtual <类型><函数名>(<参数表>)=0;
//如virtual void funtion1()=0
…
};
引用虚函数原因:
1.方便子类多态的实现
2.在很多情况下,基类本身生成的对象是不合情理的。例如,动物作为一个基类可以派生出老虎,孔雀等子类,但动物本身生成对象明显不合常理。
reference:
https://baike.baidu.com/item/%E7%BA%AF%E8%99%9A%E5%87%BD%E6%95%B0/9113729?fr=aladdin