虚函数与纯虚函数 在他们的子类中都可以被重写。它们的区别是:
(1)纯虚函数只有定义,没有实现;而虚函数既有定义,也有实现的代码。
纯虚函数一般没有代码实现部分,如
virtual void print() = 0;
而一般虚函数必须要有代码的实现部分,否则会出现函数未定义的错误。
virtual void print()
{ printf("This is virtual function\n"); }
(2)包含纯虚函数的类不能定义其对象,而包含虚函数的则可以。
如果子类想要实例化,纯虚函数必须被重写,如果子类继承了包含纯虚函数的父类,却没有重写纯虚函数,那么子类相当于也继承了纯虚函数,子类也就变成了抽象类,不能被实例化。在多重继承关系中,纯虚函数在继承层次的任何一层被重写成非纯虚函数都可以。
假如C继承B,B继承A,A声明了纯虚函数,那么在B或者C中,至少要重写一次这个纯虚函数,如果在B中重写了,那么在C中可以不再重写。如果在B中把这个纯虚函数重写成了虚函数,那么相当于这个纯虚函数已经降级成虚函数,在C中按虚函数的方式对待,可以继续重写,也可不重写。如果在B中把纯虚函数重写成了非虚函数,那么在C中以及更低层次的继承中,就不能再重写了。
重写纯虚函数virtual void fun()=0;的方式:
virtual void fun() override;
或者
void fun() override;
重写虚函数的方式也一样。
不同的是,如果声明了虚函数,那么在cpp中必须有这个虚函数的定义。
前部分内容来自百度,后部分内容是自己的总结思考,如有错误,欢迎指正。