学习整理——C++ virtual虚函数与多态

原创

学习整理——C++ virtual虚函数与多态

多态与动态绑定

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

另一个与多态相关的一个名词是动态绑定:动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。Java是一个纯面向对象的语言,要理解动态绑定,可以简单写一段代码。


 
 
  1. public class Poly {
  2. public static void main(String[] arg){
  3. Animal animal=getAnimal(System.currentTimeMillis());
  4. animal.shout();
  5. }
  6. private static Animal getAnimal(long tsp){
  7. if(tsp % 2 == 0){
  8. return new Cat();
  9. } else{
  10. return new Dog();
  11. }
  12. }
  13. }
  14. abstract class Animal{
  15. abstract public void shout();
  16. }
  17. class Cat extends Animal{
  18. @Override
  19. public void shout(){
  20. System.out.println( "Miao");
  21. }
  22. }
  23. class Dog extends Animal{
  24. @Override
  25. public void shout(){
  26. System.out.println( "Wang");
  27. }
  28. }

上述代码中,在编译期我们无法确定main()函数中的animal.shout()会调用的是输出Miao的还是Wang的函数,只有在运行期通过对当前时间戳的判断才会唯一确定,这就是动态绑定。按照这种思路,或许我们很容易将这个Java代码写成C++的代码。


 
 
  1. #include <iostream>
  2. using namespace std;
  3. class Animal{
  4. public:
  5. void shout(){
  6. cout << "Not implement" << endl;
  7. }
  8. };
  9. class Cat: public Animal{
  10. public:
  11. void shout(){
  12. cout << "Miao" << endl;
  13. }
  14. };
  15. class Dog: public Animal{
  16. public:
  17. void shout(){
  18. cout << "Wang" << endl;
  19. }
  20. };
  21. Animal* getAnimal(int flag){
  22. if(flag % 2){
  23. return new Cat();
  24. } else{
  25. return new Dog();
  26. }
  27. }
  28. int main(){
  29. int flag;
  30. cin >> flag;
  31. Animal* animal = getAnimal(flag);
  32. animal->shout();
  33. return 0;
  34. }
但是,无论输入的flag是多少,输出都会是Not implement。这是因为C++是编译性语言,在编译期,由于声明的animal变量是Animal指针,所以编译器在编译animal->shout()时,直接引用了Animal类的shout()函数,运行时就调用了该函数,输出Not implement。由于Cat和Dog都是继承自Animal,所有两者都会包含Animal的shout()函数,只不过是被重写了而在一般情况下不可见。为了解决这种问题,做到上面Java代码的类似效果,C++引入了virtual关键字,正确的写法是:


 
 
  1. #include <iostream>
  2. using namespace std;
  3. class Animal{
  4. public:
  5. virtual void shout(){
  6. cout << "Not implement" << endl;
  7. }
  8. virtual ~Animal(){}
  9. };
  10. class Cat: public Animal{
  11. public:
  12. void shout(){
  13. cout << "Miao" << endl;
  14. }
  15. };
  16. class Dog: public Animal{
  17. public:
  18. void shout(){
  19. cout << "Wang" << endl;
  20. }
  21. };
  22. Animal* getAnimal(int flag){
  23. if(flag % 2){
  24. return new Cat();
  25. } else{
  26. return new Dog();
  27. }
  28. }
  29. int main(){
  30. int flag;
  31. cin >> flag;
  32. Animal* animal = getAnimal(flag);
  33. animal->shout();
  34. return 0;
  35. }

实现原理

参考自:http://blog.csdn.net/chosen0ne/article/details/10350305

C++

在C++中通过虚函数表的方式实现多态,每个包含虚函数的类都具有一个虚函数表(virtual table),在这个类对象的地址空间的最靠前的位置存有指向虚函数表的指针。在虚函数表中,按照声明顺序依次排列所有的虚函数。实例化一个对象时调用完构造函数后,便会初始化这些指针。由于C++在运行时并不维护类型信息,所以在编译时直接在子类的虚函数表中将被子类重写的方法替换掉。当程序中将要调用一个虚函数时,编译器会编译成从指针中找到具体的实现函数。因为虚函数指针在对象实例化时就被初始化了,所以即便是该对象被一个父类指针指向也能找到正确的函数。

另外,一日为虚终生为虚。一个函数被声明为虚时,其衍生类的该函数也将一直是虚函数,即使衍生类没有显式声明为virtual。


Java

而Java中,在运行时会维持类型信息以及类的继承体系。每一个类会在方法区中对应一个数据结构用于存放类的信息,可以通过Class对象访问这个数据结构。其中,类型信息具有superclass属性指示了其超类,以及这个类对应的方法表(其中只包含这个类定义的方法,不包括从超类继承来的)。而每一个在堆上创建的对象,都具有一个指向方法区类型信息数据结构的指针,通过这个指针可以确定对象的类型。

JVM中用于方法调用的指令包括:

invokevirtual:用于调用实例方法,会根据对象的实际类型进行调用。

invokespecial:需要特殊处理的实例方法,比如:public final方法、私有方法和父类方法等。调用的方法取决于引用的类型。

invokeinterface:调用接口的方法。

invokestatic:调用类方法。

按照上面描述,对于子类覆盖父类的方法,编译后,调用指令应该是invokevirtual,调用的方法取决于对象的类型。invokevirtual方法查找的实现方式是:

1. 通过对象中类指针找到其类信息,然后在方法表中根据方法签名找到该方法。

2. 如果不在当前类,则递归查找其父类的方法表直到Object类。

3. 如果找到Object类,也没有该方法,会抛出NoSuchMethodException异常。

与js、lua等动态语言类似,Java多态的实现方式依赖于内存中的类型体系信息,存在一个“原型链”,是一个完全动态的查找过程,相对于C++而言,效率会低一些,因为存在一个链表遍历查找的过程。之所以,Java中可以这样实现,本质上是因为它是一门虚拟机语言,虚拟机会维持所有的这些类型信息。


纯虚函数

虚函数为C++提供实现动态绑定的机制,但是拥有虚函数的类本身是可以被实例化的。要实现类似Java抽象类的机制,即类本身不能实例化,其子类需要实现其所有抽象方法才能被实例化,C++提供了纯虚函数。在C++中,拥有纯虚函数的类不能被实例化,其子类也需要实现其所有纯虚函数才能被实例化。纯虚函数的写法是:


 
 
  1. virtual void shout()= 0; //纯虚函数
  2. virtual void toShout(){}; //虚函数
只拥有纯虚函数可以被用作接口来使用,提供给其衍生类才实现,类似Java的interface。


问题

1.构造函数中可以调用虚函数吗?析构函数中可以调用虚函数吗?

如果在父类构造函数中调用虚函数,由于子类还没构造,所以可能会出错,但由于C++避免这种错误,所以会调用父类的实现,但这不是多态;在子类中调用虚函数,由于子类已经构造了,此时调用虚函数跟普通方法没有任何区别。

如果在子类析构函数中调用虚函数,情况如上,和调用普通方法没有任何区别;而在父类析构函数中调用虚函数,如果只是虚函数,情况也如上,C++会调用父类的实现,但如果是纯虚函数,编译期编译器就会报错,出现undefined reference。

所以不要在构造函数和析构函数里调用虚函数,即使没有语法错误,运行也不会如你所愿,就算有时会成功(不同编译器),到最后也会让人困惑不已。这种调用根本不是起到虚函数的作用,所以为了代码规范,可以说成是不可以调用。


2.构造函数可以是虚函数吗?

不可以。虚函数指针是存放在对象内存中,一个对象在实例化(构造)前是没有内存的。如果构造函数都是虚的时候,该虚构造函数指针能够放在哪里?该问题编译器能够查看出来,是语法错误。


3.析构函数可以是虚函数吗?

当一个类拥有虚函数的时候,析构函数应当也被声明为virtual。因为当使用多态时,父类的析构函数没有声明为virtual而调用delete时,会直接调用父类析构函数,子类没有被调用。为了程序的正确运行,防止只析构基类而不析构派生类的状况发生,应当记住这个规范。





0 个人打赏
文章最后发布于: 2016-10-07 17:54:02
        <div class="recommend-box"><div class="recommend-item-box type_blog clearfix" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/weixin_30953735/article/details/82633999&quot;,&quot;strategy&quot;:&quot;BlogCommendFromMachineLearnPai2&quot;,&quot;index&quot;:&quot;0&quot;}">
<div class="content" style="width: 712px;">
	<a href="https://blog.csdn.net/weixin_30953735/article/details/82633999" target="_blank" rel="noopener" title="C++中为什么析构函数是虚函数">
	<h4 class="text-truncate oneline" style="width: 552px;">
			<em>C</em>++中为什么析构<em>函数</em>是<em>虚</em><em>函数</em>		</h4>
	<div class="info-box d-flex align-content-center">
		<p class="date-and-readNum oneline">
			<span class="date hover-show">09-11</span>
			<span class="read-num hover-hide">
				阅读数 
				2986</span>
			</p>
		</div>
	</a>
	<p class="content" style="width: 712px;">
		<a href="https://blog.csdn.net/weixin_30953735/article/details/82633999" target="_blank" rel="noopener" title="C++中为什么析构函数是虚函数">
			<span class="desc oneline">如果基类的析构函数不是虚函数,在特定情况下会导致派生来无法被析构。情况1:用派生类类型指针绑定派生类实例,析构的时候,不管基类析构函数是不是虚函数,都会正常析构情况2:用基类类型指针绑定派生类实例,析...</span>
		</a>
		<span class="blog_title_box oneline ">
								<span class="type-show type-show-blog type-show-after">博文</span>
										<a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_30953735">来自:	<span class="blog_title"> weixin_30953735的博客</span></a>
											</span>
	</p>
</div>
</div>
<div class="comment-edit-box d-flex">
	<a id="commentsedit"></a>
	<div class="user-img">
		<a href="//me.csdn.net/weixin_40515248" target="_blank" rel="noopener">
			<img class="" src="https://avatar.csdn.net/9/6/A/3_weixin_40515248.jpg">
		</a>
	</div>
	<form id="commentform">
		<input type="hidden" id="comment_replyId">
		<textarea class="comment-content" name="comment_content" id="comment_content" placeholder="想对作者说点什么"></textarea>
		<div class="opt-box"> <!-- d-flex -->
			<div id="ubbtools" class="add_code">
				<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
			</div>
			<input type="hidden" id="comment_replyId" name="comment_replyId">
			<input type="hidden" id="article_id" name="article_id" value="52749587">
			<input type="hidden" id="comment_userId" name="comment_userId" value="">
			<input type="hidden" id="commentId" name="commentId" value="">
			<div style="display: none;" class="csdn-tracking-statistics tracking-click" data-report-click="{&quot;mod&quot;:&quot;popu_384&quot;,&quot;dest&quot;:&quot;&quot;}"><a href="#" target="_blank" class="comment_area_btn" rel="noopener">发表评论</a></div>
			<div class="dropdown" id="myDrap">
				<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
				<div class="txt-selected text-truncate">添加代码片</div>
				<svg class="icon d-block" aria-hidden="true">
					<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-triangledown"></use>
				</svg>
				</a>
				<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
					<li><a data-code="html">HTML/XML</a></li>
					<li><a data-code="objc">objective-c</a></li>
					<li><a data-code="ruby">Ruby</a></li>
					<li><a data-code="php">PHP</a></li>
					<li><a data-code="csharp">C</a></li>
					<li><a data-code="cpp">C++</a></li>
					<li><a data-code="javascript">JavaScript</a></li>
					<li><a data-code="python">Python</a></li>
					<li><a data-code="java">Java</a></li>
					<li><a data-code="css">CSS</a></li>
					<li><a data-code="sql">SQL</a></li>
					<li><a data-code="plain">其它</a></li>
				</ul>
			</div>  
			<div class="right-box">
				<span id="tip_comment" class="tip">还能输入<em>1000</em>个字符</span>
				<input type="button" class="btn btn-sm btn-cancel d-none" value="取消回复">
				<input type="submit" class="btn btn-sm btn-red btn-comment" value="发表评论">
			</div>
		</div>
	</form>
</div>

	<div class="comment-list-container">
	<a id="comments"></a>
	<div class="comment-list-box" style="max-height: none;"><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="9809656" data-replyname="qq_44837408">      <a target="_blank" href="https://me.csdn.net/qq_44837408"><img src="https://avatar.csdn.net/2/5/1/3_qq_44837408.jpg" alt="qq_44837408" class="avatar"></a>        <div class="right-box ">          <div class="new-info-box clearfix">            <a target="_blank" href="https://me.csdn.net/qq_44837408"><span class="name ">男彭友</span></a><span class="date" title="2019-05-19 19:16:33">4个月前</span><span class="floor-num">#1楼</span><span class="new-comment">讲得很清楚,把Java中的多态和C++里的虚函数的作用讲得很明了</span><span class="new-opt-box"><a class="btn btn-link-blue btn-report" data-type="report">举报</a><a class="btn btn-link-blue btn-reply" data-type="reply">回复</a></span></div><div class="comment-like " data-commentid="9809656"><svg class="icon "><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use></svg><span></span></div></div></li></ul></div>
	<div id="commentPage" class="pagination-box d-none" style="display: block;"><div id="Paging_042607633792782695" class="ui-paging-container"><ul><li class="js-page-first js-page-action ui-pager ui-pager-disabled"></li><li class="js-page-prev js-page-action ui-pager ui-pager-disabled">上一页</li><li data-page="1" class="ui-pager focus">1</li><li class="js-page-next js-page-action ui-pager ui-pager-disabled">下一页</li><li class="js-page-last js-page-action ui-pager ui-pager-disabled"></li></ul></div></div>
	
</div>
<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_59" data-pid="59"><script type="text/javascript">
(function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('<div style="" id="' + s + '"></div>');
    (window.slotbydup = window.slotbydup || []).push({
        id: "u3491668",
        container:  s
    });
})();

学习整理——C++ virtual函数多态 - Jeffery_Gong..._CSDN博客

6-7

多态性和函数 - nullcanon的博客 - CSDN博客

11-15

<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_60" data-pid="60"><div class="mediav_ad"><newsfeed class="newsfeed QIHOO__WEB__SO__1570432062447_180" id="QIHOO__WEB__SO__1570432062447_180" style="display:block;margin:0;padding:0;border:none;width:900px;height:84px;overflow-y:hidden;overflow-x:hidden;position:relative;text-align:left;"><info-div id="QIHOO__WEB__SO__1570432062447_180-info" style="zoom:1"><info-div class="QIHOO__WEB__SO__1570432062447_180 singleImage clk" data-href="https://s3.nzbdw.com/s?type=2&amp;r=20&amp;mv_ref=blog.csdn.net&amp;enup=CAABcVhjKAgAAihjWHEA&amp;mvid=MTA1NzY4MTQ2MTQzMjE1MDcwMTAwMTk&amp;bid=13a3b52f97dae909&amp;price=AAAAAF2a5D4AAAAAAACnmryGcRiEm6sN+4e6hg==&amp;finfo=DAABCAABAAAArggAAgAAAFoEAAM/QVqAsRVFPQAIAAIAAAADCgADBMQiM98n9KUIAAQAAAFIBgAGLbcGAAoAAAYADD9cCAAOAAAAOwoADwAAAAAAGozgAA&amp;ugi=FcTgigEVyNtrTBUCFUAVXhUAABXd++NNFoAIFcgBFoCumNOWk8oFHBasl8yH4cX49cEBFQAAAA&amp;uai=FeTGlAIlAhUEFuzJ88XXxozECRXyCCXmk+64AiUAFRoUABwW9arHmsePhtC0ARUAAAA&amp;ubi=Fcb8SxXo7O0CFYjB8RgVuvXXXBUEFRwWgtKsiBcW7MmIreGMkcQJNAIWqOCQgAglBhWZwoiWCRWmARUANpC8tNXJsYCR6AEA&amp;clickid=0&amp;cpx=__OFFSET_X__&amp;cpy=__OFFSET_Y__&amp;cs=__EVENT_TIME_START__&amp;ce=__EVENT_TIME_END__&amp;adsw=__ADSPACE_W__&amp;adsh=__ADSPACE_H__&amp;csign2=qQaNPZX6fvo=&amp;url=http%3A%2F%2Fsx1.aihuaiedu.cn%2Fhh360%2Fpc%2Fzs%2Fa12%2F%3Fll-zs-sz-H0201" data-pv="https://s3.nzbdw.com/s?type=1&amp;r=20&amp;tid=MTA1NzY4MTQ2MTQzMjE1MDcwMTAwMTk&amp;finfo=DAABCAABAAAArggAAgAAAFoEAAM/QVqAsRVFPQAIAAIAAAADCgADBMQiM98n9KUIAAQAAAFIBgAGLbcGAAoAAAYADD9cCAAOAAAAOwoADwAAAAAAGozgAA&amp;mv_ref=blog.csdn.net&amp;enup=CAABcVhjKAgAAihjWHEA&amp;mvid=MTA1NzY4MTQ2MTQzMjE1MDcwMTAwMTk&amp;bid=13a3b52f97dae909&amp;ugi=FcTgigEVyNtrTBUCFUAVXhUAABXd++NNFoAIFcgBFoCumNOWk8oFHBasl8yH4cX49cEBFQAAAA&amp;uai=FeTGlAIlAhUEFuzJ88XXxozECRXyCCXmk+64AiUAFRoUABwW9arHmsePhtC0ARUAAAA&amp;ubi=Fcb8SxXo7O0CFYjB8RgVuvXXXBUEFRwWgtKsiBcW7MmIreGMkcQJNAIWqOCQgAglBhWZwoiWCRWmARUANpC8tNXJsYCR6AEA&amp;ds=1&amp;price=AAAAAF2a5D4AAAAAAACnmryGcRiEm6sN+4e6hg==,https://max-l.mediav.com/rtb?type=2&amp;ver=1&amp;v=CGQSEDEzYTNiNTJmOTdkYWU5MDkYsqOKASCisEUoAWIXMTA1NzY4MTQ2MTQzMjE1MDcwMTAwMTmIAQA&amp;k=gRiA6AAAAAA=&amp;w=AAAAAF2a5D4AAAAAAACnytO0op3zRNhf7bXs_A&amp;i=bOahTbleyDZQ&amp;exp=BQBECQFEAQJECQBEEABDJQBD&amp;z=1" data-clk="https://max-l.mediav.com/rtb?type=3&amp;ver=1&amp;v=CGQSEDEzYTNiNTJmOTdkYWU5MDkYsqOKASCisEUoAWIXMTA1NzY4MTQ2MTQzMjE1MDcwMTAwMTlwAA&amp;k=1rZcRwAAAAA=&amp;i=bOahTbleyDZQ&amp;exp=BQBECQFEAQJECQBEEABDJQBD&amp;x=__OFFSET_X__&amp;y=__OFFSET_Y__&amp;st=__EVENT_TIME_START__&amp;et=__EVENT_TIME_END__&amp;adw=__ADSPACE_W__&amp;adh=__ADSPACE_H__&amp;tc=&amp;turl=">
<info-div class="wrap">
    <info-div class="singleImage-img singleImage-img-left">
        <info-div class="img" style="background-image:url(https://s3m.nzwgs.com/galileo/622371-1e05d9904067e76a09c88c78ca286dcc.jpg)"><info-div class="ads-tag"></info-div></info-div>
    </info-div>
    <info-div class="singleImage-body singleImage-body-left">
        <info-div class="singleImage-title">10月起,深圳有一种学历叫免考本科,一年课程,毕业即正规本科</info-div>
        <info-div class="singleImage-desc">爱华学历中心 · 猎媒</info-div>
    </info-div>
C++将多态基类的析构函数声明为virtual的作用 - 伏雌摘..._CSDN博客

11-22

6.函数多态 - weixin_34319111的博客 - CSDN博客

5-21

		<div class="recommend-item-box blog-expert-recommend-box" style="display: block;">
		<div class="d-flex">
			<div class="blog-expert-recommend">
				<div class="blog-expert">
					<div class="blog-expert-flexbox" data-report-view="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/weixin_30953735" target="_blank"><img src="https://avatar.csdn.net/2/5/5/3_weixin_30953735.jpg" alt="花岗岩先生" title="花岗岩先生"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="weixin_30953735" data-nick="花岗岩先生">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/weixin_30953735" target="_blank"><h5 class="oneline" title="花岗岩先生">花岗岩先生</h5></a></span>  <p></p><p class="article-num" title="20篇文章"> 20篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/zhangqk2016" target="_blank"><img src="https://avatar.csdn.net/4/7/C/3_zhangqk2016.jpg" alt="zhangqk2016" title="zhangqk2016"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="zhangqk2016" data-nick="zhangqk2016">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/zhangqk2016" target="_blank"><h5 class="oneline" title="zhangqk2016">zhangqk2016</h5></a></span>  <p></p><p class="article-num" title="2篇文章"> 2篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/simon_2011" target="_blank"><img src="https://avatar.csdn.net/E/9/8/3_simon_2011.jpg" alt="simon_syeming" title="simon_syeming"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="simon_2011" data-nick="simon_syeming">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/simon_2011" target="_blank"><h5 class="oneline" title="simon_syeming">simon_syeming</h5></a></span>  <p></p><p class="article-num" title="24篇文章"> 24篇文章</p><p class="article-num" title="排名:千里之外"> 排名:千里之外</p><p></p></div></div></div><div class="blog-expert-item"><div class="blog-expert-info-box"><div class="blog-expert-img-box" data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/chengde6896383" target="_blank"><img src="https://avatar.csdn.net/4/6/2/3_chengde6896383.jpg" alt="AndyCheng_hgcc" title="AndyCheng_hgcc"></a><span data-report-click="{&quot;mod&quot;:&quot;popu_710&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><span class="blog-expert-button-follow btn-red-follow" data-name="chengde6896383" data-nick="AndyCheng_hgcc">关注</span></span></div><div class="info"><span data-report-click="{&quot;mod&quot;:&quot;popu_709&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/Jeffery_Gong/article/details/52749587&quot;}"><a href="https://blog.csdn.net/chengde6896383" target="_blank"><h5 class="oneline" title="AndyCheng_hgcc">AndyCheng_hgcc</h5></a></span>  <p></p><p class="article-num" title="816篇文章"> 816篇文章</p><p class="article-num" title="排名:6000+"> 排名:6000+</p><p></p></div></div></div></div>
				</div>
			</div>
		</div>
	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/i_chaoren/article/details/77281785&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;5&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/i_chaoren/article/details/77281785&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;5&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/i_chaoren/article/details/77281785&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:4,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/i_chaoren/article/details/77281785&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:4,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/i_chaoren/article/details/77281785" target="_blank">              		<h4 class="text-truncate oneline" style="width: 633px;"><em>C</em>++<em>多态</em>--<em>虚</em><em>函数</em><em>virtual</em>及override - <em>学习</em>使我快乐 - <em>C</em>SDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">10-4</span>                    </p>                  </div>                </a>            	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/xuzhan666/article/details/80797890&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;6&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/xuzhan666/article/details/80797890&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;6&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/xuzhan666/article/details/80797890&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:5,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/xuzhan666/article/details/80797890&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:5,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/xuzhan666/article/details/80797890" target="_blank">              		<h4 class="text-truncate oneline" style="width: 624px;"><em>C</em>++<em>虚</em><em>函数</em>与<em>多态</em>总结 - xuzhan666的博客 - <em>C</em>SDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">11-25</span>                    </p>                  </div>                </a>            	</div>
C++ 函数使用注意点 与 多态的关系 - zhanghow的博客 - CSDN博客

11-22

...C++学习笔记(五)函数多态 - 帽帽的博客 - CSDN博客...

10-21

<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_61" data-pid="61"><div id="_y8w3wu4929zwx08b2jk5u3di" style="width: 100%;"><iframe width="852" frameborder="0" height="66" scrolling="no" src="https://pos.baidu.com/s?hei=66&amp;wid=852&amp;di=u3600846&amp;ltu=https%3A%2F%2Fblog.csdn.net%2FJeffery_Gong%2Farticle%2Fdetails%2F52749587&amp;psi=c189395cc7ca7b5d01ff29d9bf8beaa0&amp;par=1600x870&amp;cja=false&amp;cec=UTF-8&amp;dc=3&amp;cfv=0&amp;drs=1&amp;cce=true&amp;cpl=21&amp;ari=2&amp;pcs=1759x834&amp;ltr=https%3A%2F%2Fblog.csdn.net%2FJeffery_Gong%2Farticle%2Fdetails%2F52749587&amp;ccd=24&amp;prot=2&amp;dis=0&amp;ps=6812x530&amp;ti=%E5%AD%A6%E4%B9%A0%E6%95%B4%E7%90%86%E2%80%94%E2%80%94C%2B%2B%20virtual%E8%99%9A%E5%87%BD%E6%95%B0%E4%B8%8E%E5%A4%9A%E6%80%81&amp;tcn=1570432063&amp;chi=1&amp;ant=0&amp;pss=1758x8706&amp;tpr=1570432062709&amp;psr=1600x900&amp;cmi=25&amp;pis=-1x-1&amp;cdo=-1&amp;exps=111000,110011&amp;tlm=1570432062&amp;dtm=HTML_POST&amp;dri=0&amp;dai=5&amp;col=zh-CN"></iframe><em style="width:0px;height:0px;"></em></div><script type="text/javascript" src="//rabc1.iteye.com/common/web/production/79m9.js?f=aszggcwz"></script><img class="pre-img-lasy" data-src="https://kunyu.csdn.net/1.png?p=61&amp;a=622&amp;c=0&amp;k=&amp;d=1&amp;t=3&amp;u=24786462e62a47429b51e56900833cb6"></div></div><div class="recommend-item-box baiduSearch recommend-box-ident" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/HardessGod/article/details/81284407&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;9&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/HardessGod/article/details/81284407&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;9&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/HardessGod/article/details/81284407&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:8,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/HardessGod/article/details/81284407&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:8,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/HardessGod/article/details/81284407" target="_blank">              		<h4 class="text-truncate oneline" style="width: 633px;"><em>c</em>++ 深入理解<em>虚</em><em>函数</em>和<em>多态</em>原理 - HardessGod的博客 - <em>C</em>SDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">10-5</span>                    </p>                  </div>                </a>            	</div><div class="recommend-item-box baiduSearch recommend-box-ident" data-report-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_41661919/article/details/80789708&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;10&quot;}" data-report-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_41661919/article/details/80789708&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:&quot;10&quot;}" data-track-view="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_41661919/article/details/80789708&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:9,&quot;extend1&quot;:&quot;_&quot;}" data-track-click="{&quot;mod&quot;:&quot;popu_614&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_41661919/article/details/80789708&quot;,&quot;strategy&quot;:&quot;searchFromBaidu1&quot;,&quot;index&quot;:9,&quot;extend1&quot;:&quot;_&quot;}" data-flg="true">                <a href="https://blog.csdn.net/qq_41661919/article/details/80789708" target="_blank">              		<h4 class="text-truncate oneline" style="width: 633px;"><em>C</em>++课程笔记——<em>虚</em><em>函数</em>与<em>多态</em> - <em>C</em>SDN博客</h4>                  <div class="info-box d-flex align-content-center">                    <p>                      <span class="date">6-24</span>                    </p>                  </div>                </a>            	</div>
<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_62" data-pid="62"><script type="text/javascript">
(function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('<div style="" id="' + s + '"></div>');
    (window.slotbydup = window.slotbydup || []).push({
        id: "u3600849",
        container:  s
    });
})();

c++中virtual作用
06-23

刚开始看virtual关键字,对于这个东西理解的也不太透彻,virtual关键字我的理解就是一个指向子类的基类指针dad *a =new son(),如果在dad类方法里使用了virtual关键字定义 论坛

C++ virtual问题
07-24

#include <iostream> #include <string> #include <sstream> using namespace std; class Highlight { publ 论坛

<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_63" data-pid="63"><script type="text/javascript">
    (function() {
        var s = "_" + Math.random().toString(36).slice(2);
        document.write('<div style="" id="' + s + '"></div>');
        (window.slotbydup = window.slotbydup || []).push({
            id: "u4221910",
            container: s
        });
    })();

<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_64" data-pid="64"><script type="text/javascript">
(function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('<div style="" id="' + s + '"></div>');
    (window.slotbydup = window.slotbydup || []).push({
        id: "u3600856",
        container:  s
    });
})();

<div class="recommend-item-box recommend-recommend-box"><div id="kp_box_65" data-pid="65"><script type="text/javascript">
    (function() {
        var s = "_" + Math.random().toString(36).slice(2);
        document.write('<div style="" id="' + s + '"></div>');
        (window.slotbydup = window.slotbydup || []).push({
            id: "u4221803",
            container: s
        });
    })();

析构函数已经是函数了,为什么还会调用基类的析构函数?
10-20

struct B{ virtual ~B(){cout<<"B dtor"<<endl;} }; struct D:B{ ~D(){cout<<"D dtor"<<endl;} }; int mai 论坛

            <div class="recommend-item-box type_hot_word">
                            <div class="content clearfix" style="width: 712px;">
                <div class="float-left">
                                    <span>
                    <a href="https://www.csdn.net/gather_19/MtTaAg0sMi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c#siki第五季</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_11/MtTaAg0sNC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c#入门推荐书</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_11/MtTaAg0sNi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c# 解码海康数据流</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_12/MtTaAg0sNy1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c# xml的遍历循环</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_17/MtTaAg0sOC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c# 取 查看源码没有的</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_15/MtTaAg0sOS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c#解决高并发 委托</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_15/MtTaAg1sMC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c#日期转化为字符串</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_14/MtTaAg1sMS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c# 显示问号</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_1f/MtTaAg1sMi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c# 字典对象池</a>
                </span>
                                    <span>
                    <a href="https://www.csdn.net/gather_1d/MtTaAg1sNC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                    c#5.0 安装程序</a>
                </span>
                                    </div>
            </div>
                            </div>
                        <div class="recommend-loading-box">
            <img src="https://csdnimg.cn/release/phoenix/images/feedLoading.gif">
        </div>
        <div class="recommend-end-box" style="display: block;">
            <p class="text-center">没有更多推荐了,<a href="https://blog.csdn.net/" class="c-blue c-blue-hover c-blue-focus">返回首页</a></p>
        </div>
    </div>
                <div class="template-box">
            <span>©️2019 CSDN</span><span class="point"></span>
        <span>皮肤主题: <a href="https://blog.csdn.net/weixin_40515248" target="_blank" style="color:#3399ea">skin-yellow</a></span>
        <span> 设计师:
                                CSDN官方博客                            </span>
        </div>
                    <div id="reward" class="reward-box" style="top: 0px; left: -378px;">
<p class="rewad-title">打赏<span class="reward-close"><svg t="1567152543821" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10924" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="12"><defs><style type="text/css"></style></defs><path d="M512 438.378667L806.506667 143.893333a52.032 52.032 0 1 1 73.6 73.621334L585.621333 512l294.485334 294.485333a52.074667 52.074667 0 0 1-73.6 73.642667L512 585.621333 217.514667 880.128a52.053333 52.053333 0 1 1-73.621334-73.642667L438.378667 512 143.893333 217.514667a52.053333 52.053333 0 1 1 73.621334-73.621334L512 438.378667z" fill="" p-id="10925"></path></svg></span></p>
<dl>
	<dd><a href="javascript:;"><img src="https://avatar.csdn.net/9/F/D/3_jeffery_gong.jpg" alt=""></a></dd>
	<dt>
		<p class="blog-name">Jeffery_Gong</p>
		<p class="blog-discript">“你的鼓励将是我创作的最大动力”</p>
	</dt>
</dl>
<div class="money-box">
    			            	<span class="choosed choose_money" data-id="5">5C币</span>
		        							<span class="choose_money" data-id="10">10C币</span>
		        							<span class="choose_money" data-id="20">20C币</span>
		        							<span class="choose_money" data-id="50">50C币</span>
		        							<span class="choose_money" data-id="100">100C币</span>
		        							<span class="choose_money" data-id="200">200C币</span>
		        	</div>
<div class="sure-box">
	<p class="is-have-money"><a class="reward-sure">确定</a></p>
</div>
        </main>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值