什么是虚函数和纯虚函数?以及区别?
虚函数:
定义:被virtual关键字修饰的成员函数。在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数。其用法格式为:virtual 函数返回类型 函数名(参数表){函数体}。
特性:虚函数实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
实现:虚函数既有定义,也有实现的代码。
类对象:包含虚函数的类可以定义其对象。
纯虚函数:
- 定义:在函数句首使用virtual关键字修饰,并且在句末增加“= 0”的函数。如virtual void funtion() = 0。
- 特性:纯虚函数是特殊的虚函数,它只有函数名、参数、返回值类型,没有函数体。它要求每个派生类都必须提供具体的实现。
- 实现:纯虚函数只有声明,没有实现。但需要注意的是,基类可以存在纯虚函数的实现(但无意义,因为子类都要重写)。
- 抽象类:包含纯虚函数的类被称为“抽象类”。抽象类不能实例化,即不能使用new操作符创建对象。只有实现了所有纯虚函数的子类才能实例化。
- 目的:定义纯虚函数的目的在于,使每一个派生类都拥有相同的函数规范。
虚函数与纯虚函数的区别
- 定义与实现:虚函数既有定义也有实现,而纯虚函数只有定义(声明)没有实现。
- 类实例化:包含虚函数的类可以实例化,而包含纯虚函数的类(抽象类)不能实例化。
- 子类要求:虚函数在子类中可以被覆盖,也可以不被覆盖;而纯虚函数必须在子类中实现,否则编译器将报错。
- 用途:虚函数主要用于实现多态性,允许根据对象的实际类型调用适当的函数;而纯虚函数主要用于定义抽象接口,子类通过实现纯虚函数来提供具体的功能实现。
综上所述,虚函数和纯虚函数在C++中各有其独特的用途和特性。虚函数是实现多态性的关键,而纯虚函数则是定义抽象类和接口继承的基础。