快速业务通道

细谈C++多态性的“动”与“静”

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
t; << endl;
}
};
class C11 : public C1
...{
public:
void Test()
...{
cout << "call C11 Test()" << endl;
}
};
class C12 : public C1
...{
public:
void Test()
...{
cout << "call C12 Test()" << endl;
}
};

我们可以知道 Test() 是虚函数,从C1派生的类必定有自己的虚表。而且根据别的资料,虚表指针是放在对象的首地址的,我们下面就来验证一下:

// 验证首地址
C11 obj110;
C11 obj111;
printf("obj110 的地址:%x ", &obj110);
printf("obj111 的地址:%x ", &obj111);
printf("obj110 虚表的地址:%x ", *(&obj110));
printf("obj111 虚表的地址:%x ", *(&obj111));

结果是:

obj110 的地址:12ff7c

obj111 的地址:12ff78

obj110 虚表的地址:432098

obj111 虚表的地址:432098

由上面的结果我们可以验证:

1、一个类一个VTABLE,而不是一个对象一个VTABLE。

2、对象的首地址的内容就是VTABLE的地址。

总结一下:

C++的多态性包括其概念和实现,本文从编译器生成的代码来讨论C++多态特性,特别说明了为什么多态特性被称为“动态联编”,它和“静态联编”有什么不同,它们的“动”与“静”体现在哪里。另外还对对象的虚表做了些验证。好了,希望本文能对你认识C++的多态性有一定的帮助!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号