📜  C ++ |虚函数|问题2(1)

📅  最后修改于: 2023-12-03 15:13:45.335000             🧑  作者: Mango

C++ | 虚函数 | 问题2

问题描述

在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++中,虚函数是一种用于实现多态的机制,能让同一个函数在不同的对象上产生不同的行为。通过在父类中声明虚函数,在子类中重新定义虚函数,实现动态绑定或后期绑定。同时,在使用虚函数时,务必将析构函数声明为虚函数,以保证在对象销毁时,能够正确地释放内存空间。