📅  最后修改于: 2023-12-03 15:13:58.251000             🧑  作者: Mango
在C++中,虚函数的作用是实现多态性。当我们用基类指针或引用指向派生类对象时,虚函数会被动态绑定到派生类对象中的实现。
虚函数是在基类中声明的成员函数,带有关键字 virtual
。派生类可以覆盖基类中的虚函数,提供自己的实现。
class Shape {
public:
virtual void draw() {
std::cout << "Shape::draw()" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() {
std::cout << "Circle::draw()" << std::endl;
}
};
Shape *shape = new Circle;
shape->draw(); // 输出 Circle::draw()
在上面的例子中,Shape
类中的 draw()
函数被声明为虚函数。Circle
类重写了 Shape
类的 draw()
函数,实现了自己的版本。当使用基类指针指向一个 Circle
类的实例时,Circle
类的版本被调用,输出 Circle::draw()
。
纯虚函数是没有实现体的虚函数,它们的声明以 = 0
结尾。
class Shape {
public:
virtual void draw() = 0;
};
上述代码中的 draw()
函数被声明为纯虚函数。这意味着它没有实现体,必须由派生类提供实现。
使用虚函数的主要原因是实现多态性。当我们使用基类指针或引用指向派生类对象时,虚函数会被动态绑定到派生类对象中的实现。
Shape *shape;
shape = new Circle;
shape->draw(); // 输出 Circle::draw()
shape = new Square;
shape->draw(); // 输出 Square::draw()
在上述代码中,shape
可以指向不同的派生类对象,在调用 draw()
函数时会根据实际的派生类类型选择正确的实现。
虚函数是实现多态性的重要机制。在使用基类指针或引用指向派生类对象时,虚函数会被动态绑定到派生类对象中的实现。从而实现了运行时多态。纯虚函数则是定义接口的重要方式,它们没有实现体,必须由派生类提供实现。