1.多态的定义
多态即多种形态,根据不同的对象调用同一虚函数时产生的不同状态
虚函数:
使用 virtual 关键字定义的成员函数
示例:
#include<iostream>
using namespace std;
class father
{
public:
virtual void print()
{
cout << "父类print()的调用" << endl;
}
};
class son1:public father
{
public:
virtual void print()
{
cout << "子类1print()的调用" << endl;
}
};
class son2:public father
{
public:
virtual void print()
{
cout << "子类2print()的调用" << endl;
}
};
void test1(father &temp)
{
temp.print();
}
int main()
{
son1 son1;
son2 son2;
test1(son1);
test1(son2);
}
2.纯虚函数和抽象类
1)纯虚函数:
由于父类的虚函数一般情况下不被调用所以可以使用纯虚函数来化简
纯虚函数即没有具体实现的虚函数
语法:虚函数(省略{}) = 0;
示例
class father
{
public:
virtual void print() = 0;
};
2)抽象类
包含纯虚函数的类
抽象类特点
无法实例化对象
3.虚析构和纯虚析构
由于当产生多态且子类在堆上开辟空间,父类指针无法释放子类的数据为了解决这个问题产生了虚析构和纯虚析构
示例
class Animal {
public:
Animal()
{
cout << "Animal 构造函数调用!" << endl;
}
virtual void Speak() = 0;
//析构函数加上virtual关键字,变成虚析构函数
//virtual ~Animal()
//{
// cout << "Animal虚析构函数调用!" << endl;
//}
virtual ~Animal() = 0;
};
Animal::~Animal()
{
cout << "Animal 纯虚析构函数调用!" << endl;
}
//和包含普通纯虚函数的类一样,包含了纯虚析构函数的类也是一个抽象类。不能够被实例化。
class Cat : public Animal {
public:
Cat(string name)
{
cout << "Cat构造函数调用!" << endl;
m_Name = new string(name);
}
virtual void Speak()
{
cout << *m_Name << "小猫在说话!" << endl;
}
~Cat()
{
cout << "Cat析构函数调用!" << endl;
if (this->m_Name != NULL) {
delete m_Name;
m_Name = NULL;
}
}
public:
string *m_Name;
};
void test01()
{
Animal *animal = new Cat("Tom");
animal->Speak();
//通过父类指针去释放,会导致子类对象可能清理不干净,造成内存泄漏
//怎么解决?给基类增加一个虚析构函数
//虚析构函数就是用来解决通过父类指针释放子类对象
delete animal;
}
int main() {
test01();
system("pause");
return 0;
}