1. 多态相关概念
1.1 简述:多态
1. 什么是多态
- 不同的对象去做同一个行为时,得到的结果不同。反应到编程语言中,即为不同类型的对象调用同一个函数,得到的返回值不同。
class Person
{
public:
virtual void BuyTicket()
{
cout << "全票" << endl;
}
};
class Children : public Person
{
public:
virtual void BuyTicket()
{
cout << "半票" << endl;
}
};
void BuyTicket(Person& p)
{
p.BuyTicket();
}
int main()
{
Person p1;
Children p2;
BuyTicket(p1);
BuyTicket(p2);
return 0;
}
2. 虚函数
- 虚函数:被关键字
virtual
修饰的函数
virtual void func1()
{
//...
}
3. 构成多态的条件
- 父类与子类的虚函数必须构成重写关系(三同:函数名,函数参数,函数返回值相同)
- 必须用父类的指针或者引用去调用虚函数。
4. 多态的特殊情况
- 协变:父类与子类的虚函数返回值不同,也可以构成重写,只是返回值类型必须为父类/子类(不是同一父类/子类也可以)的指针或者引用。
- 析构函数即使函数名不同也构成重写,这是因为编译在编译时会将析构函数的名字统一处理为
destructor
。- 特殊的,父类的虚函数加virtual,子类的虚函数不加virtual也构成重写,子类的虚函数被视作实现重写(建议不要省略)。
class A
{
public:
virtual void func(int a = 1)
{
cout << "A->" << a << endl;
}
virtual void test()
{
func();
}
};
class B : public A
{
public