程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [C++ Primer]類的多態

[C++ Primer]類的多態

編輯:C++入門知識

一,概述
        1)接口的多種不同的實現方式即為多態。
        2)多態性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在C++中都是通過虛函數(Virtual Function) 實現的。
        3)關鍵點:多態還有個關鍵之處就是一切用指向基類的指針或引用來操作對象

二,示例
1)普通的對象操作方式
[html] 
#include <iostream> 
using namespace std; 
class A{ 
public: 
    void print() 
    {  
        cout<<"This is A"<<endl; 
    }  
}; 
class B:public A{ 
public: 
    void print() 
    {  
        cout<<"This is B"<<endl; 
    } 
}; 
int main(){ //為了在以後便於區分,我這段main()代碼叫做main1   
    A a;  
    B b;  
    a.print(); 
    b.print(); 

輸出:This  is  A  
           This  is  B
2)按照多態的操作對象方式:通過父類對象來操作子類對象
[html]
#include <iostream> 
using namespace std; 
class A{ 
public: 
    void print() 
    {  
        cout<<"This is A"<<endl; 
    }  
}; 
class B:public A{ 
public: 
    void print() 
    {  
        cout<<"This is B"<<endl; 
    } 
}; 
int main(){ //通過父類來操作子類  
    A a;  
    B b;  
    A* p1=&a; 
    A* p2=&b; 
    p1->print(); 
    p2->print(); 

輸出:This  is  A  
           This  is  A
這跟我們預期的不一樣

3)采用多態,就是在父類函數前面加上virtual
     根據不同的類對象,調用其相應的函數,這個函數就是虛函數
[html] 
#include <iostream> 
using namespace std; 
class A{ 
public: 
    virtual void print() 
    {  
        cout<<"This is A"<<endl; 
    }  
}; 
class B:public A{ 
public: 
    void print() 
    {  
        cout<<"This is B"<<endl; 
    } 
}; 
int main(){ //通過父類來操作子類  
    A a;  
    B b;  
    A* p1=&a; 
    A* p2=&b; 
    p1->print(); 
    p2->print(); 

三,虛函數進階
      void (A::*fun)(); //定義一個函數指針   
A *p=new B;
fun=&A::fun;//是真正獲得虛函數的地址嗎? 其實間接獲得虛函數地址的一段代碼的地址
[html] 
#include <iostream> 
using namespace std; 
 
class A{  
public: 
    virtual void fun() 
    {  
        cout<<"A::fun"<<endl; 
    } 
    virtual void fun2() 
    { 
        cout<<"A::fun2"<<endl; 
    } 
};  
class B:public A{ 
public: 
    void fun() 
    {  
        cout<<"B::fun"<<endl; 
    } 
    void fun2() 
    { 
         cout<<"B::fun2"<<endl; 
    } 
};  
void CallVirtualFun(void *pThis , int  index=0) 

    void (*funptr)(void*); 
    long lVptrAddr; 
    memcpy(&lVptrAddr,pThis,4); 
    memcpy(&funptr,reinterpret_cast<long*>(lVptrAddr)+index,4); 
    funptr(pThis);  
}  
int main() 

 
    void (A::*fun)(); //定義一個函數指針    
    A *p=new B; 
    fun=&A::fun;//是真正獲得虛函數的地址嗎? 其實間接獲得虛函數地址的一段代碼的地址 
    (p->*fun)();//B::fun  
    fun = &A::fun2; 
    (p->*fun)();//B::fun2 
      
    CallVirtualFun(p); //調用虛函數p->fun()  
    CallVirtualFun(p,1);//調用虛函數p->fun2()  
    delete p; 
    system("pause"); 
    return 0;  
}  

作者:tianshuai11
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved