一:多态性
从代码实现上,如果调用虚函数走的流程是虚函数表,那么就是多态。
二:纯虚函数
#include "pch.h"
#include <iostream>
using namespace std;
class human
{
public:
void fun() { }
virtual void eat() = 0; //虚函数声明后面加上=0就成为了一个纯虚函数
/*纯虚函数,没有函数实体,
因为有纯虚函数的存在,所以human类成了一个
抽象类,纯虚函数,也就是说在基类中,只给出函数的声明,而具体的
函数实现部分交给子类去做。
*/
};
class man :public human
{
public:
void eat() { cout << "面食" << endl; };
};
class woman :public human
{
public:
void eat() { cout << "米饭" << endl; }; //错误
};
int main()
{
//human phuman; //因为是一个抽象类,所以不能定义对象。
return 0;
}
三:虚析构(基类的析构函数一般写成虚函数)
#include "pch.h"
#include <iostream>
using namespace std;
class human
{
public:
void fun() { }
virtual void eat() { }
human()
{
cout << "human()" << endl;
}
~human()
{
cout << "~human()" << endl;
}
};
class man :public human
{
public:
void eat() { cout << "面食" << endl; };
man()
{
cout << "man()" << endl;
}
~man()
{
cout << "~man()" << endl;
}
};
class woman :public human
{
public:
void eat() { cout << "米饭" << endl; };
woman()
{
cout << "woman()" << endl;
}
~woman()
{
cout << "~woman()" << endl;
}
};
int main()
{
human *phuman = new man;
delete phuman; //并没有调用man的析构函数,会造成内存泄漏,
/*那怎么办?可以把基类的析构函数写成虚析构函数就可以了,
virtual ~human()
{
cout << "~human()" << endl;
}*/
//即使父类和子类的析构函数不同名,但是虚函数的性质还是会影响到子类当中,即动态绑定。
return 0;
}
可参考:https://blog.csdn.net/Hackbuteer1/article/details/7558868