目录
1.多态概念
不同的对象做同一件事,具有不同的结果。
例:拿买票举例,儿童买票会享受半价,成人买票只能全价,儿童和成人两个对象,都去执行买票这件事,儿童是半价,成人是全家。
2.多态的定义和实现
2.1多态的定义
1. 必须通过基类的指针或者引用调用虚函数。
2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
class person
{
public:
virtual void BuyTicket()
{
cout << "全价票" << endl;
}
};
class children : public person
{
virtual void BuyTicket()
{
cout << "半价票" << endl;
}
};
void fun(person * A)
{
A->BuyTicket();
}
int main()
{
person A;
children B;
fun(&A);
fun(&B);
}
2.2虚函数
由virtual修饰的函数为虚函数
virtual void BuyTicket()
{
cout << "全价票" << endl;
}
2.3虚函数的重写
派生类中由一个和基类完全相同的虚函数,称子类的虚函数重写了基类的基函数。
析构函数的重写:只要基类的析构函数为虚函数,那么派生类的析构函数,即使名字不相同也构成重写。因为析构函数无论叫什么名字在编译之后都叫destructor。
2.4重载,重写(覆盖),重定义(隐藏)对比
重载:1.在同一作用域
2.函数名相同 参数不同
重写:1.两个函数分别在基类和派生类
2.函数名/参数/返回值都必须相同
3.必须是虚函数
隐藏:1.两个函数分别在基类和派生类
2.函数名相同
3.不构成重写
3.抽象类
概念:在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。
例:
class Car
{
public:
virtual void Drive() = 0;
};
class Benz :public Car
{
public:
virtual void Drive()
{
cout << "Benz-舒适" << endl;
}
};
class BMW :public Car
{
public:
virtual void Drive()
{
cout << "BMW-操控" << endl;
}
};
void Test()
{
Car* pBenz = new Benz;
pBenz->Drive();
Car* pBMW = new BMW;
pBMW->Drive();
}
抽象类强制派生类重写虚函数
因为如果不重写,就会把纯虚函数继承过来,派生类也变成抽象类了。