【C++ Primer】類的多態

來源:互聯網
上載者:User

一,概述

        1)介面的多種不同的實現方式即為多態。

        2)多態性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指標賦值給父類類型的指標。多態性在C++中都是通過虛函數(Virtual Function) 實現的。

        3)關鍵點:多態還有個關鍵之處就是一切用指向基類的指標或引用來操作對象


二,樣本

1)普通的對象操作方式

#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)按照多態的操作對象方式:通過父類對象來操作子類對象

#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

     根據不同的類對象,調用其相應的函數,這個函數就是虛函數

#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;//是真正獲得虛函數的地址嗎? 其實間接獲得虛函數地址的一段代碼的地址

#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; } 


四,補充重要知識

       執行個體化類的虛函數必須有定義,原因如下:有虛函數作為成員函數的類, 它的執行個體化-對象, 在運行過程分配到的記憶體不止是它的成員資料, 還有一個指向該類虛函數表(vtable)的指標, 虛函數表中的每個資料項目都是一個虛函數的入口地址; 

       如果一個對象的虛函數只有聲明而沒有實現, 就會出現這個虛函數表找不到本應作為其資料項目之一的某函數的入口地址,
虛函數表在運行前不能裝載完成, 所以產生串連錯誤!







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.