VC++基类,派生类,虚函数 对象实现 (*****)

来源:互联网 发布:win10一直准备windows 编辑:程序博客网 时间:2024/06/06 07:36

 

转:http://xmurobin.blogbus.com/logs/4516167.html

有关基类,派生类,虚函数
三个结论
/////////////////////////////
 假设有:
   class CBase--->class CDerived
   BaseFunc()      DeriFunc()
   Communc()    Communc()
/////////////////////////


 1.如果你以一个"基类之指针"指向"派生类之对象",那么经由该指针你只能够调用基类所定义的函数.
虽然我们可以令pBase实际指向Cderived对象,却因为pBase得类型,使他只能够调用BaseFunc(),不能调用DeriFunc().
 CBase *pBase;
 CDerived aDerive("Rukocy");
 *pBase = &pDerived;//right,一个Derived对象一定是Base类,但其只能调用BaseFunc()

 

 2.如果你以一个"派生类之指针"指向一个基类的对象",你必须先做明显的转型操作(explicit cast).这种做法很危险,不符合现实生活经验.
 CDerived *pDeri;
 CBase aBase("Jason");
 pDeri = &aBase;//这样写有问题!一个Base的对象不一定是CDerived

 

 3.如果基类和派生类都定义了"相同名称之成员函数",那么通过对象指针调用成员函数时,到底调用那一个函数,必须视该指针的原始类型而定,而不是视指针实际所指的对象的类型而定
 pBase->Communc()  //永远指向CBase::Communc()
 pDerived->Communc()//永远指向CDerived::Communc()

 

PS:从此需要满足多态性,引入了虚函数
   如果你以一个基类之指针指向一个派生类之对象,那么通过设定其为虚函数,你就调用派生类的成员函数,按照孙鑫习惯性的描述:虚函数--子类有调用子类的,子类没有调用父类的!
MFC中两个十分重要的虚函数:CDocument 有关的Serialize()与和CView有关的OnDraw()
CObject--->CDocument--->CMyDoc
CMyDoc mydoc;
CMyDoc *pmydoc = new CMyDoc;
mydoc.func() == ((CDocument*)&mydoc)->func() == pmydoc->func() 
但是((CDocument)mydoc).func()不同于上面三者,调用的是基础类的虚函数,并没有实现我们预期的多态,这种性质是因为其转换的是整个对象,不是指针,并且被截断了.同时,(CMyDoc)cdocument这样的转换是不允许的.

 

 

原创粉丝点击