在C++中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。
面向对象的方法中这样表述多态性:向不同对象发送同一个消息,不同的对象在接收时会产生不同的方法。
#include <iostream>
using namespace std;
class point {
public:
virtual void print() {
cout << "point";
}
};
class circle :public point {
public:
virtual void print() {
cout << "circle";
}
};
void print1(circle *p) { //测试框架
p->print();
}
int main() {
point p1;
circle c1;
print1(&p1);
print1(&c1);
system("pause");
}
多态的发生要有继承,虚函数重写,父类的指针或引用做函数参数。
C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
从系统实现的角度看,多态性分为两类:
静态多态性和动态多态性 //静态多态性是通过函数的重载实现的,动态多态性是在程序运行过程中才动态确定操作的对象
静态多态性也称为编译时的多态性,动态多态性又称为运行时的多态性
动态多态性是通过虚函数实现的。
把一个函数名与一个类对象捆绑在一起,建立关联。
在类的继承层次结构中,在不同层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。编译系统按照同名覆盖的原则决定调用的对象。
在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。
C++中虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数。
虚析构函数的应用场景:
用new运算符建立临时对象,用delete销毁对象时,只会调用基类的析构函数,而不会执行派生类的析构函数。
#include <iostream>
using namespace std;
class point {
public:
point(int a = 0, int b = 0) {
this->a = a;
this->b = b;
}
virtual ~point() { //定义虚析构函数
a = 0;
b = 0;
cout << "point 析构";
}
private:
int a;
int b;
};
class circle :public point {
public:
circle(int r = 0) {
this->r = r;
}
~circle() {
r = 0;
cout << "circle 析构";
}
private:
int r;
};
int main() {
point *p = new circle(2);
delete p;
system("pause");
}
将基类的析构函数声明为虚函数时,由该基类派生的所有派生类的析构函数都自动成为虚函数。
在单继承的情况下,子类会继承父类的vptr,如果子类重写了父类的虚函数,那么虚函数表中父类的虚函数地址会被覆盖。