虚函数与纯虚函数的区别
虚函数(Virtual Function)
- 定义:虚函数是一个在基类中被声明为
virtual
的成员函数,可以在派生类中被重写(Override)。 - 目的:允许派生类提供特定的实现,同时保持接口的一致性。
- 调用:可以在派生类对象上调用,也可以在基类指针或引用上调用。实际执行的函数取决于指针或引用所指向的对象的实际类型。
- 实现:虚函数在基类中可以有实现,也可以没有。如果没有实现,派生类可以选择重写它,也可以不重写。
- 多态性:虚函数是实现运行时多态性的关键,允许通过基类接口调用派生类的方法。
纯虚函数(Pure Virtual Function)
- 定义:纯虚函数是一个在基类中声明为
virtual
,并且没有实现的成员函数,其声明以 = 0
结束。 - 目的:用来声明接口,强制派生类提供具体的实现。它使得基类成为一个抽象类(Abstract Class),不能实例化。
- 调用:不能直接调用,因为它们没有实现。只有当派生类重写了纯虚函数后,才能通过派生类对象或基类指针调用。
- 实现:在基类中没有实现,必须在派生类中被重写。
- 抽象类:包含至少一个纯虚函数的类是抽象类,不能被直接实例化。
区别
- 实现:虚函数可以在基类中有实现,而纯虚函数没有实现,必须在派生类中实现。
- 抽象性:包含纯虚函数的类是抽象类,不能被实例化;而包含虚函数的类不一定是抽象类。
- 强制实现:纯虚函数强制要求派生类提供实现,而虚函数不强制。
- 接口定义:纯虚函数主要用于定义接口,而虚函数可以用于定义接口也可以用于提供默认实现。
示例
class Base {
public:
virtual void show() {
std::cout << "Base show" << std::endl;
}
virtual void display() = 0;
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived show" << std::endl;
}
void display() override {
std::cout << "Derived display" << std::endl;
}
};