深入理解c++中virtual关键字


在C++中,`virtual` 关键字是一个非常关键的概念,它主要用于实现多态性。通过 `virtual`,你可以定义一个在派生类(子类)中可以重写的成员函数。这意味着当通过基类指针或引用调用这个函数时,将会调用与指针或引用实际指向的对象类型相对应的函数版本。

下面是对 `virtual` 关键字深入理解的一些关键点:

1. **虚函数(Virtual Functions)**:

当基类中的成员函数被声明为 `virtual` 时,该函数在派生类中可以被重写(override)。调用这样的函数时,将根据对象的实际类型来决定调用哪个版本的函数。


   class Base {
   public:
       virtual void show() {
           std::cout << "Base show" << std::endl;
       }
   };

   class Derived : public Base {
   public:
       void show() override { // override 关键字是C++11引入的,不是必需的,但用于清晰表明意图
           std::cout << "Derived show" << std::endl;
       }
   };

   int main() {
       Base* b = new Derived();
       b->show(); // 输出 "Derived show",展示了多态性
       delete b;
       return 0;
   }
   

2. **虚析构函数(Virtual Destructor)**:

当基类中有动态分配的资源或基类指针指向派生类对象时,应将基类的析构函数声明为 `virtual`。这确保了当通过基类指针删除派生类对象时,派生类的析构函数会首先被调用,然后是基类的析构函数,从而避免了资源泄露。


   class Base {
   public:
       virtual ~Base() {
           // 清理资源的代码
       }
   };

   class Derived : public Base {
   public:
       ~Derived() {
           // 清理Derived特有的资源
       }
   };
   

3. **纯虚函数(Pure Virtual Functions)**:

一个被声明为 `virtual` 且没有函数体的成员函数是纯虚函数。纯虚函数通过在函数声明的末尾添加 `= 0` 来指定。含有纯虚函数的类称为抽象基类,不能直接实例化对象。


   class AbstractBase {
   public:
       virtual void pureVirtualFunction() = 0; // 纯虚函数
   };

   class Derived : public AbstractBase {
   public:
       void pureVirtualFunction() override {
           // 实现纯虚函数
       }
   };
   

通过理解和使用 `virtual` 关键字,C++程序员可以有效地利用多态性,实现更加灵活和强大的面向对象设计。