C++---多态
一、基本用法
1.多态的必要条件:
①必须是基类的指针或者引用调用虚函数
②被调用的函数必须是虚函数,并且完成了虚函数的重写
2.重写
子类中有跟基类中的虚函数完全相同的虚函数(返回值,函数名,参数类型)
3.代码演示
class Person
{
public:virtual void func(){}//基类中只需要声明不需要实现,因为多态就是基类的声明+子类的实现
};
class Student : public Person
{
public:virtual void func(){cout << "子1" << endl;}
};
class Teacher : public Person
{
public:virtual void func(){cout << "子2" << endl;}
};
void Func(Person* ptr)
{ptr->func();
}
int main()
{Person ps;Student st;Teacher th;Func(&ps);Func(&st);//输出"子1"Func(&th);//输出"子2"
}
4.一个选择题
class A
{
public:virtual void func(int val = 1) { cout << "A->" << val << endl; }virtual void test() { func(); }
};
class B : public A
{
public:void func(int val = 0) { cout << "B->" << val << endl; }
};
int main()
{B* p = new B;p->test();return 0;
}
输出结果是多少?
p调用test,然后调用func,使用A的声明B的实现。B->1
二、析构函数的重写
析构函数函数名不同也构成重写
class A
{
public:virtual ~A(){cout << "A()" << endl;}
};
class B : public A
{
public:~B(){cout << "~B()->delete:" << _p << endl;}
protected:int* _p = new int[10];
};
int main()
{A* p1 = new A;A* p2 = new B;delete p1;delete p2;return 0;
}
三、关键字
1.override
加在虚函数后边可以自动检查是否有错误导致无法构成重写
函数名错误自动检查出来
2.final
①写在类名后边不可被继承
②加在虚函数后边无法被重写
四、纯虚函数和抽象类
在虚函数后边写上=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;}
};
int main()
{//Car car;//纯虚函数无法实例化抽象类/Car* pBenz = new Benz;pBenz->Drive();Car* pBMW = new BMW;pBMW->Drive();return 0;
}