- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++中的虚函数(一??? 虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难。我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术。说明一点,写这篇文章只是想和大家交流学习经验因为本人学识浅薄,难免有一些错误和不足,希望大家批评和指正,在此深表感谢!一、 基本概念??? 首先,C++通过虚函数实现多态.无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变的处理方式被称为多态性。在某个基类上建立起来的类的层次构造中,可以对任何一个派生类的对象中的同名过程进行调用,而被调用的过程提供的处理可以随其所属的类而变。虚函数首先是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。二、 虚函数的定义与派生类中的重定义
class 类名{
public:
virtual 成员函数说明;
}
class 类名:基类名{
public:
virtual 成员函数说明;
}
三、 虚函数在内存中的结构1.我们先看一个例子:
#include iostream.h
#include string.h
class A {
public:
virtual void fun0() { cout A::fun0 endl; }
};
int main(int argc, char* argv[])
{
A a;
cout Size of A = sizeof(a) endl;
return 0;
}
结果如下:Size of A = 42.如果再添加一个虚函数:virtual void fun1() { cout A::fun endl;}得到相同的结果。如果去掉函数前面的virtual修饰符
class A {
public:
void fun0() { cout A::fun0 endl; }
};
int main(int argc, char* argv[])
{
A a;
cout Size of A = sizeof(a) endl;
return 0;
}
结果如下:Size of A = 1?3.在看下面的结果:
class A {
public:
virtual void fun0() { cout A::fun0 endl; }
int a;
int b;
};
int main(int argc, char* argv[])
{
A a;
cout Size of A = sizeof(a) endl;
return 0;
}
结果如下:Size of A = 12 其实虚函数在内存中结构是这样的:图一??? 在window2000下指针在内存中占4个字节,虚函数在一个虚函数表(VTABLE)中保存函数地址。在看下面例子。
class A {
public:
virtual void fun0() { cout A::fun0 endl; }
virtual void fun1() { cout A::fun1 endl; }
int a;
int b;
};
int main(int argc, char* argv[])
{
A a;
cout Size of A = sizeof(a) endl;
return 0;
}
结果如下:结果如下: Size of A = 4??? 虚函数的内存结构如下,你也可以通过函数指针,先找到虚函数表(VTABLE),然后访问每个函数地址来验证这种结构,在国外网站作者是:Zeeshan Amjad写的ATL on the Hood中有详细介绍图二4.我们再来看看继承中虚函数的内存结构,先看下面的例子
class A {
public:
virtual void f() { }
};
class B {
public:
virtual void f() { }
};
class C {
public:
virtual void f() { }
};
class Drive : public A, public B, public C {
};
int main() {
Drive d;
cout Size is = sizeof(d) endl;
return 0;
}
结果如下:Size is = 12 ,相信大家一看下面的结构图就会很清楚
您可能关注的文档
最近下载
- 信号与系统(刘泉)习题答案解析.pdf
- 2025年新沪科版物理八年级上册 实践 制作水油沙漏 教学课件.pptx VIP
- 国家助学金申请表格[整理].pdf VIP
- 人教PEP版六年级英语上册《Unit 3》全单元教学课件 优秀公开课课件.pdf VIP
- 食材配送服务流程.docx VIP
- 颈椎病(寒湿痹阻)病历书写模板.docx VIP
- 光伏电站日常安全巡检标准流程.docx VIP
- 人教PEP版六年级英语上册《Unit 2》全单元教学课件 优秀公开课课件.pdf VIP
- DB1302T 157-2001 无公害冬瓜生产技术规程.docx VIP
- 某文体中心项目结构抗震专项分析.pdf VIP
原创力文档


文档评论(0)