晚捆绑(late binding=动态绑定(dynamic binding)=运行时绑定(runtime binding)
如果一个函数在基类被声明为virtual,那么在所有的派生类中它都是virtual的。在派生类中virtual函数的重定义通常称为重写
纯虚函数禁止对抽象类的函数以值方式调用。这也是防止对象切片(object slicing)的一种方法。通过抽象类,可以保证在向上类型转换期间总是使用指针或引用,如果使用值则总是调用的是基类的实现
构造函数是不能为虚函数的,但析构函数能够且常常必须是虚的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接的影响。但要注意它不知不觉地引入存储泄漏(关闭程序时内在未释放)
删除一个void指针并不调用函数,所以窗口并不负责清除它的对象
#include<iostream>
#include<vector>
using namespace std;
class Rodent{
public:
virtual void fun()const=0;
virtual ~Rodent(){}
};
class Mouse:public Rodent{
public:
~Mouse(){
cout << "~Mouse()" << endl;
}
void fun()const{
cout << "M" << endl;
}
};
class Test:public Mouse{
public:
void fun()const{
cout << "Test" << endl;
}
};
class Gerbil:public Rodent{
public:
~Gerbil(){
cout << "~Gerbil()" << endl;
}
void fun()const{
cout << "G" << endl;
}
};
class Hamster:public Rodent{
public:
~Hamster(){
cout << "~Hamster()" << endl;
}
void fun()const{
cout << "H" << endl;
}
};
class BlueHamster:public Hamster{
public:
void fun()const{
cout << "B" << endl;
}
};
void testFun(Rodent * r){
r->fun();
}
int main(){
Mouse *m = new Mouse;
Gerbil *g = new Gerbil;
Hamster *h = new Hamster;
vector<Rodent *>v;
v.push_back(m);
v.push_back(g);
v.push_back(h);
for(int i=0;i<sizeof(v)/sizeof(v[0]);i++){
v[i]->fun();
delete v[i];
}
Test *test = new Test;
testFun(test);
}
result:
M
~Mouse()
G
~Gerbil()
H
~Hamster()
Test