虚函数的出现是为了实现多态。
多态我感觉 是当一个引用根据它实际指向的对象,执行对应的方法。

因为父类类型的指针,或引用可以指向继承了该父类的子类的对象。
<mark>普通函数的执行是跟着类走的,虚函数的执行是跟着对象走的</mark>
所以呢,通过虚函数来使用类的多态。

父类声明一个虚函数,由子类来实现,当然了,子类可以覆盖或着继续使用父类的虚函数。

那么纯虚函数是啥呢?就是父类完全不去实现这个虚函数,意味着子类要继承这个类就必须实现这个虚函数。这不就是接口类嘛

所以 当一个类中有一个纯虚函数的时候,这个类就不应该有对象了,因为其中的一个函数没有实现,

注意

当父类中定义了虚函数的时候,析构函数最好也定义成虚函数!!!
如果没有定义成虚函数,那么子类的对象的析构有可能析构不完全。
比如说

#include <iostream>

using namespace std;

class A {
   
public:
    virtual void run() {
   
        cout << "A" << endl;
    }
    ~A() {
   
        cout << "~A" << endl;
    }
};

class B : public A {
   
public:
    void run() {
   
        cout << "B" << endl;
    }
    ~B() {
   
        cout << "~B" << endl;
    }
};

int main(){
   
    B b;
    A *a = &b;
    a->run();
    delete a;
    return 0;
}

当然会有警告,如果不写delete a,那么编译器自动会调用b,a 的析构函数。

这里再提一下虚继承,这个是出现在有多重继承的语言中的,
为了实现菱形继承,保证b继承a,c继承a,d继承b,c后
d从b,c继承过来的a是同一片内存空间,毕竟编译器不会因为你b,c都继承a就将b,c内存中的a作为一个a,而是有两片独立的内存空间的。