注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识8--认识多态1  

2010-07-30 09:28:49|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天有同事问继承的问题,这个东西其实很简单,但如果一不注意,还是出问题的,我因此写了一个小程序,并测试成功,希望广大的童鞋们和小盆友们指正。(欢迎板砖,不但钢甲厚,而且脸皮奇厚)
下面是一个父类和一个子类,很简单,只有两个函数,我们这里要讨论的重载和继承,以及函数形式完成相同的非虚拟状态下的使用情况,其它暂不议及。

class CTestParent
{
public:
 virtual int TestFun1(){return 0;}
 int TestFun2(){return 1;}

};
class CTestSon:public CTestParent
{
public:
 int TestFun2(){return 1;}
 int TestFun1(){return 0;}
};
这里说句题外话,造成别丢了类或结构体后面的冒号,这个,很汗一个。
然后我们在生成两个实例,并调用函数,结果如何呢?

 CTestParent *ctp = new CTestParent();
 CTestParent *cs = new CTestSon();

 ctp->TestFun1();---调用父的
 ctp->TestFun2();---调用父的
 cs->TestFun1(); ---调用子的
 cs->TestFun2(); ---调用父的

这里可能前三个大家都比较清楚,第四个,新学的会有疑问,我生成的可是子类的对象啊,为什么调用父类的函数捏。这个,童鞋们,我也不清楚,什么,板砖,别,我还是说完了你们再砸。
我们浅显的介绍一下父类和子类在内存里的布局,一般情况而言,我们在new一个子类时,在内存中会先布局父类的成员,然后紧接着布置子类的成员,换句话说,我们既然有了子类的指针,那么,我们就知道了子类的指针里包含有父类的成员,我们把子类指针转到父类指针就不会出错误,因为多的地方可以不用考虑(指针的复制并不会产生内存的裁剪),但是,我们知道父类的指针,若要转到子类,由于子类的空间比父类的大,那么我们在用强制转换的指针访问子类时,会造成内存访问的越界,不可知的错误你能够忍受不?所以这个根本就能不过编译器的编译。(不过现在好象有一个函数可以实现,记不清了)这也就是多态机制中的子类指针可以转成父类指针的原因。再举个例子,父类是动物,子类是狗,那么我们可以说狗是一种动物,但不能说动物是一只狗,OK,童鞋们明白咧木。

我们对程序再做一次改动:
增加两个函数:
void CTestVCDlg::Test1(CTestParent ctp)
{
 ctp.TestFun1();
 ctp.TestFun2();
}
void CTestVCDlg::Test2(CTestParent &ctp)
{
 ctp.TestFun1();
 ctp.TestFun2();
}
然后增加调用这两个函数的代码:
 CTestParent cctp;
 CTestSon ccs;
 this->Test2(cctp);----只调用父的
 this->Test2(ccs);-----TestFun1调用子的,另外一个调用父的

同学们发现如何,嘿嘿,也就是说,我们已经说过的话,反复说滴,什么叫多态,多态就是可以用父指针来访问子指针。按现在来说,就是只有指针和引用才可以实现多态。OK,

今天的功课结束咧,小盆友们,再见。

  评论这张
 
阅读(463)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017