多态
多态就是多种形态,具体点就是当不同的对象去完成时会产生不同的状态。
把virtual
加在一个虚函数的前面,我们叫做虚函数。
虚继承和虚函数没有关系。
函数名相同,参数列表相同他们叫做重写或者覆盖,这里没有重载的关系,重载必须在同一个作用域。
#include <iostream>
using namespace std;
class Person {
public:
virtual void Buyticket()
{
cout << "买票-全价" << endl;
}
};
class Student :public Person {
public:
//重写/覆盖
virtual void Buyticket()
{
cout << "买票-半价" << endl;
}
};
void Func(Person& p)
{
p.Buyticket();
}
int main()
{
Student s;
Person p;
Func(s);
Func(p);
return 0;
}
构成多态以后传父类调用的是父类的虚函数,传子类调用的是子类的虚函数。
Func函数参数中既可以传父类的对象也可以传子类的对象。
多态的两个条件:1.虚函数的重写,三同(函数名、参数、返回值);2.父类的指针或者引用去调用。
那当我们不使用指针或者引用的时候能不能调用?不能。
我们来看一下,有些情况没有多态不行
class Person {
public:
~Person()
{
cout << "~Person" << endl;
}
};
class Student :public Person {
public:
//重写/覆盖
~Student() {
cout << "~Student" << endl;
}
};
int main()
{
Person p;
Student s;
return 0;
}
没有虚函数的情况下运行结果如上,
当我们更换为
int main()
{
/*Person p;
Student s;*/
Person* ptr1 = new Person;
Person* ptr2 = new Student;
delete ptr1;
delete ptr2;
return 0;
}
运行结果如下:
指向子类的析构函数调用的还是父类的析构函数,如果子类中有一些资源释放,没调用到会导致一些内存泄漏。
析构函数会被重命名为destructor,所以构成隐藏,谁的指针就调用谁的析构函数:
标签:调用,函数,子类,多态,Person,析构 From: https://blog.51cto.com/u_15562309/7037759