虚函数是在超类中定义的函数,它必须存在于子类中才能有完整的类定义。虚函数依赖于称为虚继承的面向对象编程范式,这在C中最常见的是使用“virtual”关键字。要定义虚函数,有两个类是必需的,一个超类和一个子类。超类是首...
虚函数是在超类中定义的函数,它必须存在于子类中才能有完整的类定义。虚函数依赖于称为虚继承的面向对象编程范式,这在C中最常见的是使用“virtual”关键字。要定义虚函数,有两个类是必需的,一个超类和一个子类。超类是首先声明函数的地方,也可能是定义函数的地方。子类是定义函数或重写函数的地方,这取决于函数是否在超类中定义。要定义虚函数,需要两个类,一个超类和一个子类。虚函数可以用两种方法之一来定义:第一,它可以定义为存根,在存根中它有一个空的主体,什么也不做;第二个,它可以定义为一个纯虚函数,在超类的头文件中,它被定义为NULL。这两种方法各有优缺点。将函数定义为存根可以确保所有子类都能实现它,即使它什么都不做。但是,如果忘记重写函数并在子类中正确实现它,不会出现任何错误或警告来指出这一点。另一方面,定义纯虚函数要求每个子类都有自己的函数定义,如果不是这样,就会出现错误。但是,虚拟函数与非虚函数遵循相同的继承规则,因此,两级以上的继承层次结构可能不需要显式定义虚函数,例如可以考虑一个声明虚函数的类a,它是在子类B中实现的,B类有自己的子类,C类不需要显式定义类a~s函数,因为它继承了B类的定义如有必要,C类可以重写类B~s函数,也可以在调用类B~s函数的同时重写它。另一个极端是,如果虚函数在子类中声明为虚函数,则不必在该子类中定义。例如,可以考虑声明虚函数并有两个子类B的类a另外,我们可以想象B类有D和E的子类,C类有F和G的子类。B类到G类都必须定义A~s类的虚函数。如果B类有A~s函数的实现,D类和E类不需要重做。也许C~s子类需要实现A~s函数,但是它们都做了一些不同的事情,所以在C类中定义函数本身就没什么用了。在这种情况下,函数在C类中可能被声明为虚函数,并且不需要实现。虚拟函数学习起来可能会令人望而生畏,但如果使用得当,它们可以减少代码重复并使代码更易于理解一般来说,虚函数有很多缺陷,尤其是在多重继承方面。在多重继承中,模糊定义的虚函数可能会相互冲突,因此在这种情况下应谨慎使用
-
发表于 2020-08-06 19:59
- 阅读 ( 810 )
- 分类:电脑网络