多态和虚函数
father *p = new father;
son *q = new son;
p -> print(); //执行父类的print
p = q;
p -> print(); //执行子类的print
即指针指向的实例是哪个类型,就调用哪个类的函数
实现原理
虚函数表:每个类的实例在加载的时候会多一个4B空间指向该类的虚函数表地址
动态联编:编译时无法知道调用的是哪个类的函数,运行时指针指向的实例是哪个类就调用哪个类的虚函数表
析构函数
father *p = new son;
delete(p);
父类析构函数不用virtual:只调用父类的析构函数 父类析构函数用virtual(子类无需加virtual):先调用子类析构函数,再调用父类析构函数
抽象类
包含纯虚函数的类
不可以有实例化对象
子类必须实现所有的纯虚函数,才能去掉抽象类身份