纯虚函数:virtual
1.问题的产生: 通过基类的指针删除派生类对象时只调用基类的析构函数
例:
class CSon{
public: ~CSon() { };
};
class CGrandson : CSon{
public: ~CGrandson() { };
}
int main(){
CSon *p = new CGrandson; delete p; return 0;
}
2. 解决办法:
把基类的析构函数声明为virtual,派生类的析构函数 virtual可以不进行声明;
通过 基类的指针删除派生类对象:
首先调用 派生类的析构函数
然后调用 基类的析构函数 类如果定义了虚函数, 则最好将析构函数也定义成虚函数
例:
1.
class son{
public:
~son() {
cout<<"bye from son"<<endl;
};
};
class grandson : public son{
public:
~grandson(){
cout<<"bye from grandson"<<endl;
};
};
int main(){
son *pson;
pson=new grandson;
delete pson;
return 0;
}
输出结果: bye from son
没有执行grandson::~grandson()!!!
2.
class son{
public:
virtual ~son() {
cout<<"bye from son"<<endl;
};
};
class grandson : public son{
public:
~grandson(){
cout<<"bye from grandson"<<endl;
};
};
int main() {
son *pson;
pson= new grandson;
delete pson;
return 0;
}
输出结果: bye from grandson bye from son
抽象类:含有纯虚函数的类
*只能作为基类来派生
*不能创建对象
*抽象类指针或引用->其派生类的对象
*抽象类构造和析构函数不能调用纯虚函数
*继承类如果把基类(抽象类)里所有的纯虚函数全部实现,继承类就不是抽象类了