虚函数的出现是为了实现多态。
多态我感觉 是当一个引用根据它实际指向的对象,执行对应的方法。
因为父类类型的指针,或引用可以指向继承了该父类的子类的对象。
<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,而是有两片独立的内存空间的。