- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[C中虚函数的作用
C++中虚函数的作用(多态的原理)
2009-04-17 22:02■ 如果你期望衍生类别重新定义一个成员函数,那么你应该在基础类别中把此函数设为virtual。■ 以单一指令唤起不同函数,这种性质称为Polymorphism,意思是the ability toassume many forms,也就是多态。■ 虚拟函数是C++ 语言的Polymorphism 性质以及动态绑定的关键。
■ 既然抽象类别中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上=0 即可)。
■ 我们可以说,拥有纯虚拟函数者为抽象类别(abstract Class),以别于所谓的具象类别(concrete class)。
■ 抽象类别不能产生出对象实体,但是我们可以拥有指向抽象类别之指针,以便于操作抽象类别的各个衍生类别。
■ 虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词。
虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈.
下面是对C++的虚函数这玩意儿的理解.
一.什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始)
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码:
class A{
public:
void print(){ coutThis is Aendl;}
};
class B: public A{
public:
void print(){ coutThis is Bendl;}
};
int main() //为了在以后便于区分,我这段main()代码叫做main1
{
A a;
B b;
a.print();
b.print();
}
通过class A和class B的print()这个接口,可以看出这两个class因个体的差异而采用了不同的策略,输出的结果也是我们预料中的,分别是This is A和This is B.但这是否真正做到了多态性呢? No,多态还有个关键之处就是一切用指向基类的指针或引用来操作对象.那现在就把main()处的代码改一改.
int main() //main2
{
A a;
B b;
A* p1=a;
A* p2=b;
p1-print();
p2-print();
}
运行一下看看结果,哟呵,蓦然回首,结果却是两个This is A.问题来了,p2明明指向的是class B的对象但却是调用的class A的print()函数,这不是我们所期望的结果,那么解决这个问题就需要用到虚函数.
class A{
public:
virtual void print(){ coutThis is Aendl;} //现在成了虚函数了
};
class B: public A{
public:
void print(){ coutThis is Bendl;} //这里需要在前面加上关键字virtual吗?
};
毫无疑问,class A的成员函数print()已经成了虚函数,那么class B的print()成了虚函数了吗?回答是Yes,我们只需在把基类的成员函数设为virtual,其派生类的相应的函数也会自动变为虚函数.所以,class B的print()也成了虚函数.那么对于在派生类的相应函数前是否需要用virtual关键字修饰,那就是你自己的问题了.
现在重新运行main2的代码,这样输出的结果就是This is A和This is B了.
现在来消化一下,我作个简单的总结,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数.
二.虚函数是如何做到的(如果你没有看过《Inside The C++ Object Model》这本书,但又急切想知道,那你就应该从这里开始.)
虚函数是如何做到因对象的不同而调用其相应的函数的呢?现在我们就来剖析虚函数.我们先定义两个类:
class A{ //虚函数示例代码
public:
virtual void fun(){cout1endl;}
virtual void fun2(){cout2endl;}
};
class B: public A{
public:
void fun(){cout3endl;}
void fun2(){cout4endl;}
};
由于这两个类中有虚函数存在,所以编译器就会为他们两个分别插入一段你不知道的数据,并为他们分别创建一个表.那段数
您可能关注的文档
- [ArcMap的地图符号制作.docx
- [第五章传播类型.ppt
- [ARCgiss水文提取2.docx
- [ArrangingaMeeting安排会议.docx
- [APS.doc
- [ARM、DSP、FPGA的特点和区别.doc
- [第五章假山工程.ppt
- [第五章光学造型表现手段ok.ppt
- [ARMCortex-A15处理器架构与iPad3性能配置前瞻.doc
- [AppStore新应用上传教程还不会的孩童注意了.docx
- 区委书记、市国资委党委领导班子2025年组织生活会对照“四个带头”含反面典型案例举一反三剖析方面检查材料【两篇文】.docx
- 局党组书记、市国资委党委领导班子2025年组织生活会对照“四个带头”含反面典型案例举一反三剖析方面个人检查材料2篇文.docx
- 市交通运输局局长2025年专题生活会对照“四个带头”含落实意识形态工作责任制方面个人对照检查发言提纲与检察院领导班子“四个带头”检查材料【2篇文】.docx
- 市投资促进局党支部书记2025年组织生活会对照“四个带头”个人对照检查发言材料与党组书记“四个带头”个人对照检查材料(内蒙古地区四个对照,反面典型案例检视剖析)【2篇文】.docx
- 市教育局党委副书记、市国资委党委领导班子2025年“四个带头”个人对照检查发言材料(上年度整改+个人事项+典型事例剖析)2篇文.docx
- 2025年专题生活会“四个带头”方面对照检视材料(问题+原因+措施+意识形态)与纪检委员专题生活会“四个带头”方面个人对照检查材料【2篇文】.docx
- 检察院领导班子2025年专题生活会对照“四个带头”检查材料与县司法局专题生活会党组书记个人对照“四个带头”对照检查材料(含反面典型案例全面剖析)2篇文.docx
- 市机关事务局党支部书记、局党组书记2025年组织生活会对照“四个带头”含反面典型案例举一反三剖析方面个人发言材料、检查材料【2篇文】.docx
- 2025年领导干部专题生活会“四个带头”对照检查材料与市审计局领导班子专题生活会“四个带头”含反面典型案例剖析对照检查材料2篇文.docx
- 2025年县司法局专题民主生活会班子围绕“4个带头”对照检查材料与反面典型案例回顾与剖析对照检查发言材料2篇文.docx
文档评论(0)