多态

在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,如果子类重写了父类的虚函数,那么虚函数表中父类的虚函数地址会被覆盖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值