📅  最后修改于: 2023-12-03 15:13:45.335000             🧑  作者: Mango
在C++中,虚函数有什么用途?如何定义和使用虚函数?
在C++中,虚函数是一种用于实现多态的机制。多态指的是同一个函数在不同的对象上产生不同的行为。虚函数允许在父类中定义一个方法,并且让它在子类中被重新定义,而在调用时,根据对象类型来决定实际调用哪个方法。这就是所谓的动态绑定或者后期绑定。
在C++中,虚函数的定义方式是在父类中声明为虚函数,即在函数前面添加virtual关键字。然后在子类中重新定义该函数即可。
class Shape { // 定义父类Shape
public:
virtual void draw() { // 声明虚函数
cout << "Shape::draw()" << endl;
}
};
class Circle : public Shape { // 定义Circle子类
public:
void draw() { // 重新定义虚函数
cout << "Circle::draw()" << endl;
}
};
int main() {
Shape *shape; // 父类指针
Circle circle; // Circle对象
shape = &circle; // 父类指针指向Circle对象
shape->draw(); // 调用虚函数
return 0;
}
上面的代码定义了一个父类Shape和一个子类Circle,Circle从Shape继承而来,并重新定义了Shape中的虚函数draw。在主函数中,声明了一个父类指针shape,将其指向一个Circle对象,并调用了虚函数draw,根据对象类型,实际上调用的是Circle中的draw函数。输出结果为:
Circle::draw()
在使用虚函数时,务必将析构函数也声明为虚函数,以保证在对象销毁时,能够正确地释放内存空间。
class Shape {
public:
virtual ~Shape() { // 虚析构函数
cout << "Shape::~Shape()" << endl;
}
};
class Circle : public Shape {
public:
~Circle() { // 非虚析构函数
cout << "Circle::~Circle()" << endl;
}
};
int main() {
Shape *shape = new Circle();
delete shape; // 调用虚析构函数,释放内存
return 0;
}
上面的代码中,定义了一个Shape类和一个Circle类,然后声明了一个父类指针指向一个Circle对象。在程序结束时,执行delete操作时,因为声明为虚析构函数,能够正确地调用子类的析构函数并释放内存空间。输出结果为:
Circle::~Circle()
Shape::~Shape()
在C++中,虚函数是一种用于实现多态的机制,能让同一个函数在不同的对象上产生不同的行为。通过在父类中声明虚函数,在子类中重新定义虚函数,实现动态绑定或后期绑定。同时,在使用虚函数时,务必将析构函数声明为虚函数,以保证在对象销毁时,能够正确地释放内存空间。