在 C++ 中的虚函数与纯虚函数区别
在 C++ 中,虚函数和纯虚函数都是面向对象编程中常见的概念。它们可以作为类的成员函数,实现多态性,从而实现动态绑定。本文将分别介绍虚函数和纯虚函数的定义、特性和差异。
虚函数
定义
虚函数是在基类中声明为虚拟的函数,可以被继承类覆盖重写,使继承类对象可以根据对象类型来动态选择调用哪个函数。
特性
- 虚函数的调用是动态绑定的。也就是说,如果基类指针指向派生类对象,那么调用虚函数时会自动根据对象类型选择调用该对象中所定义的函数,而不是基类中的函数。
- 虚函数可以被继承类覆盖重写,没有函数体的虚函数称为纯虚函数。
示例代码
class Shape {
public:
virtual void draw() {
std::cout << "I am a shape." << std::endl;
}
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "I am a circle." << std::endl;
}
};
int main() {
Shape *s = new Circle();
s->draw(); // I am a circle.
return 0;
}
纯虚函数
定义
纯虚函数是一个没有函数体的虚函数,在基类中定义,要求在派生类中重新定义实现。如果派生类没有重新定义实现,则派生类也会变成抽象类。
特性
- 纯虚函数必须在基类中声明,且不包括函数体,也就是说没有默认实现。
- 派生类必须实现该方法,否则无法实例化该类。
- 纯虚函数允许变量初始化,但是需要在派生类的构造函数中进行。
示例代码
class Shape {
public:
virtual void draw() = 0;
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "I am a circle." << std::endl;
}
};
int main() {
Shape *s = new Circle();
s->draw(); // I am a circle.
return 0;
}
区别
- 纯虚函数和虚函数都是虚函数。
- 纯虚函数必须在派生类中实现,而虚函数可以在派生类中选择性地覆盖。
- 能被定义的纯虚函数称为纯虚函数,不能被定义的纯虚函数称为抽象函数。
- 虚函数可选定义,纯虚函数必须定义。
结论
虚函数和纯虚函数虽然都是 C++ 中实现动态绑定的重要手段,但是在定义和特性上还是有明显差别。合理使用虚函数和纯虚函数,有助于实现公共接口和多态性,从而更好地支持面向对象编程。