定义区别
- 虚函数:在基类中使用
virtual
关键字声明的成员函数,其在基类中有具体实现。例如:
class Base {
public:
virtual void func() {
std::cout << "Base::func" << std::endl;
}
};
- 纯虚函数:在基类中声明且没有具体实现,声明格式为在函数声明后加上
= 0
。例如:
class Base {
public:
virtual void func() = 0;
};
使用场景区别
- 虚函数:用于实现多态,当基类的某个函数在不同派生类中有不同实现方式,但基类中可能存在一个通用的默认实现时使用。比如一个图形类
Shape
有一个 draw
虚函数,不同形状如 Circle
、Rectangle
继承 Shape
并重写 draw
函数来实现各自的绘制逻辑,而 Shape
中的 draw
可以提供一个通用提示。
- 纯虚函数:用于定义抽象基类,当基类的某个函数在基类中没有实际意义,必须由派生类去实现才有意义时使用。例如
Animal
类有一个 makeSound
纯虚函数,具体的 Dog
、Cat
等派生类继承 Animal
并实现 makeSound
函数来发出各自的声音。
对类的影响区别
- 虚函数:包含虚函数的类可以被实例化,即可以创建对象。因为虚函数在基类有实现,所以对象可以调用该虚函数(即使派生类重写了,也可以通过基类指针或引用调用基类版本)。
- 纯虚函数:包含纯虚函数的类为抽象基类,不能被实例化。只有派生类实现了所有纯虚函数后,该派生类才能被实例化。例如上述
Base
类不能创建对象,而如果有 class Derived : public Base { public: void func() override { std::cout << "Derived::func" << std::endl; } };
,Derived
类可以创建对象。