c++virtualvoidvsnovirtual

  • Post category:other

c++中virtual和非virtual函数的区别

在C++中,virtual和非virtual函数的区别在于是否支持多态。本文将详细讲解virtual和非virtual函数的区别,包括两个示例。

virtual函数

在C++中,virtual函数是支持多态的函数。当一个类中的函数被声明为virtual时,它可以被子类重写,从而实现多态。以下是一个使用virtual函数的示例:

#include <iostream>
using namespace std;

class Shape {
   public:
      virtual void draw() {
         cout << "Drawing Shape" << endl;
      }
};

class Circle: public Shape {
   public:
      void draw() {
         cout << "Drawing Circle" << endl;
      }
};

int main() {
   Shape *shape;
   Circle circle;
   shape = &circle;
   shape->draw();
   return 0;
}

在上面的示例中,首先定义了一个Shape类,其中的draw被声明为virtual。然后,定义了一个Circle类,它继承自Shape类,并重写了draw函数。在main函数中,创建了一个Circle对象,并将其赋值给一个Shape指针。最后,调用了Shape指针的draw函数,实现了多态。

非virtual函数

在C++中,非virtual函数是不支持多态的函数。当一个类中的函数没有被声明为virtual时,它不能被子类重写,从而无法实现多态。以下是一个使用非virtual函数的示例:

#include <iostream>
using namespace std;

class Shape {
   public:
      void draw() {
         cout << "Drawing Shape" << endl;
      }
};

class Circle: public Shape {
   public:
      void draw() {
         cout << "Drawing Circle" << endl;
      }
};

int main() {
   Shape *shape;
   Circle circle;
   shape = &circle;
   shape->draw();
   return 0;
}

在上面的示例中,定义了一个Shape类,其中的draw函数没有被声明为virtual。然后,定义了一个Circle类,它继承自Shape类,并重写了draw函数。在main函数中,创建了一个Circle对象,并将其赋值给一个Shape指针。最后,调用了Shape指针的draw函数,于draw函数不是virtual函数,因此调用的是Shape类中的draw函数,而不是Circle类中的draw函数。

总结

本文详细讲解了C++中virtual和非virtual函数的区别,包括支持多态和不支持多态两种情况。通过本文的学习,读者可以了解C++中如何使用virtual函数实现多态。