目录
1. 多态的概念
1.1 什么是多态?
多态的概念:通俗的来说,就是多种形态。可以理解为不同的对象去做同一件事件会产生不同的结果。
举个例子:
比如在抢火车票这个案例,对于普通人则是全价,对于学生是半价,对于军人则是优先购买。
这就是多态的特点:对于不同的对象会产生不同的效果
2.多态的定义及实现
2.1 多态的构成条件
多态是不同继承关系的对象,去调用同一个函数,产生不同的行为,比如Student类继承了Person类,Person类调用其Buyticket函数则是原价买票,而Student调用Buyticket函数则是半价买票。
那么构成多态的条件究竟是什么呢?(最重要的一点之一)
1. 必须是基类的指针或者引用去接收子类对象,然后调用虚函数
2.被调用的函数必须是虚函数,且派生类必须对虚函数进行重写
class Person
{
public:
virtual void BuyTicket()
{
cout << "全价 - 100元" << endl;
}
};
class Student :public Person
{
public:
virtual void BuyTicket()
{
cout << "半价 - 50元" << endl;
}
};
void Buy(Person* p)
{
p->BuyTicket();
}
int main()
{
Person p;
Student st;
Buy(&p); //调用的是父类的BuyTicket函数
Buy(&st);//调用的是子类的BuyTicket函数
return 0;
}
2.2 虚函数
什么是虚函数?
被virtual关键字修饰的类成员函数就被称为虚函数
class Person
{
public:
virtual void BuyTicket()
{
cout << "全价 - 100元" << endl;
}
};
2.3 虚函数的重写
虚函数的重写也被称为覆盖,是指派生类中存在和基类完全相同的函数,(即派生类函数和基类函数的参数、名称、返回值相同,也被称为三同),则派生类虚函数为基类虚函数的重写
例如:
class Person
{
public:
virtual void BuyTicket()
{
cout << "全价 - 100元" << endl;
}
};
class Student :public Person
{
public:
virtual void BuyTicket()
{
cout << "半价 - 50元" << endl;
}
};
虚函数重写的两大例外:
1.函数的协变(派生类虚函数和基类虚函数的返回值不相同)
派生类重写基类虚函数时,返回值可以不和基类虚函数相同,基类的返回值为基类的指针或者引用,派生类的范胡子为派生类的指针或者引用,这种重写被称为协变
2. 析构函数的重写
如果基类析构函数是虚函数,那么只要派生类的析构函数完成定义,那么就构成了重写,虽然基类和派生类析构函数的名称不同,看起来没有遵循三同的规则,其实不然,这里是因为编译器将所有的析构函数名处理成了destructor,因此只要基类析构函数是虚函数,那么派生类就重写了基类的函数。
我们看见基类的指针接受了派生类对象,因此在释放空间时,调用的是派生类重写的析构函数,这里就说明了其实析构函数是完成了重写,如果没有完成重写,则调用的是自身的析构函数
2.4 override和final关键字
由于C++对于重写的实现方式比较严格,但不能保证每次写重写都是正确的,可能也会忘记写一下东西,而这些东西在运行期间是不会被检查出现的,因此C++中提供了两个关键字来帮助我们发现重写中的错误
1. final修饰虚函数,表示该修饰的虚函数不能被重写
2. override修饰虚函数,检查被修饰的虚函数是否完成了重写
如果没有完成对基类虚函数的重写&#x