设为首页 加入收藏

TOP

C++基础之三大特性之多态(顾客,别走啊,我这是羊肉,不是狗肉啊)
2015-07-20 17:25:52 来源: 作者: 【 】 浏览:3
Tags:基础 三大 特性 顾客 别走啊 这是 羊肉 不是 狗肉

多态:多种形态

举个例子,你有两个fun函数,第一个类中fun的功能是打印1,第二个类的fun的功能是打印2,你建一个类的对象,调fun,想打印1就能打印1,想打印2就能打印2,这就是多态,这就是多种形态,这也就是我们代码中需要达到的要求

多态的本质:灵活的复用

多态的前提:继承的基础上

多态的实现:虚函数(有的人把重载这些也当作多态,静态的多态,这种东西看个人理解,不用扣这些字眼,下面才是重中之重---虚函数)

虚函数关键字:virtual

知识点一:

class A                 void A::fun()      class B : public A		void B::fun()
{			{		{				{
public:			printf("1");	public:				printf("2");
virtual void fun();	}		virtual void fun();		}
};					};
B *p = new B;   p->fun();
需求:不碰最后一行代码,怎么能调到A中的fun();

我们讲一下虚函数的原理

当类中有虚函数,建类的对象,对象空间的前四个字节放的是虚表地址,通过虚表地址找到虚表,虚表中有这个类的所有虚函数的地址

当继承有虚函数的类后,例如上面的B类,B类对象的前四个字节就有字节的虚表,如果B类有自己的虚函数,B类对象前四个字节是虚表的地址,地址找到的是自己类的虚函数地址----如果B类没有自己类的虚函数,它仍有虚表(继承),虚表找到的虚函数地址是父类(即上面A类)虚函数的地址
vc7S19PA4LXEZnVux7DD5tKyvNPBy9Dpuq/K/bXEudi8/NfWxNijrNXiyse49ry8x8k8L3A+CjxwPjxzdHJvbmc+t8DWudf308M8L3N0cm9uZz48L3A+CjxwPsjnufvT0NK7zOzT0NK7uPZDwOC8zLPQwcvO0s/W1Nq1xNfTwOBCwOCjrMTHQsDgvs2zycHLuLjA4KOsvajBy0PA4LXEttTP86OsQ8DgttTP89PQ19S8urXEZnVuuq/K/aOsztK1xNKqx/PKx7X308NDwOC1xGZ1brqvyv2jrLWrysfI57n709DIy7W3wtK78tXfsrvH5bP+o6y9q7XDtb1DwOC21M/ztdjWt7XE1rjV68e/16qzyULA4LXE1rjV66Ostfe1vbXEvs3Kx0LA4LXEZnVuuq/K/cHLPC9wPgo8cD7Wqsq2tePI/aO6PHN0cm9uZz7Q6c72ubk8L3N0cm9uZz6jqNOmuLbPwsPm1eLW1sfpv/ajqTwvcD4KPHA+z8LD5tXitcDM4tPQyrLDtM7KzOLC8DwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">calss A class B

{				{				A *p = new B;
public:				public:				delete p;
char *p;			char *t;
A(){ p = new char[20];	}	B(){ t = new char[20]; }
~A(){ delete p; }		~B(){	delete t; }
};				};
我们看一下反汇编

\\
这里Cs是子类,就是上面的B,上面的代码执行汇编是这样,看到01001757行代码调用子类的析构

所以这道题是B类的成员指针new出的空间泄漏了

当我们将父类的析构函数前加个virtual再看汇编

\01001878调用的edx里面的内容\\在子类析构后最后调父类的析构

虚析构,调子类的析构---调父类析构

顺序为什么是先子后父呢---你要子类还用着,就析构了父类不就野指针了~~

虚析构是个好习惯

知识点四:纯虚函数

虚函数声明的时候后面写 = 0,这个类就是抽象类,这个函数就是纯虚函数

拥有纯虚函数的类不能建对象

如果HR问我纯虚函数,我就说 =0和不能建这个类的对象,我不会说抽象类这些概念,什么叫抽象

什么时候用到纯虚函数,就是这个类你确定以后不会建对象了,就写成纯虚函数

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu5067Harry And Dig Machine(TS.. 下一篇POJ 1631 Bridging signals(LIS ..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)
·MySQL 数据类型:从 (2025-12-26 18:20:03)
·Linux Shell脚本教程 (2025-12-26 17:51:10)
·Qt教程,Qt5编程入门 (2025-12-26 17:51:07)