【C++ Primer】类的多态
一,概述
? ? ? ? 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::fun2CallVirtualFun(p); //調用虛函數p->fun() CallVirtualFun(p,1);//調用虛函數p->fun2() delete p;system("pause");return 0; }
四,補充重要知識
?? ? ? 實例化類的虛函數必須有定義,原因如下:有虛函數作為成員函數的類, 它的實例化-對象, 在運行過程分配到的內存不止是它的成員數據, 還有一個指向該類虛函數表(vtable)的指針, 虛函數表中的每個數據項都是一個虛函數的入口地址;?
? ? ? ?如果一個對象的虛函數只有聲明而沒有實現, 就會出現這個虛函數表找不到本應作為其數據項之一的某函數的入口地址, 虛函數表在運行前不能裝載完成, 所以產生連接錯誤!
轉載于:https://www.cnblogs.com/secbook/archive/2012/07/10/2654976.html
總結
以上是生活随笔為你收集整理的【C++ Primer】类的多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 默认网关和默认路由的区别
- 下一篇: Oracle init.ora常用配置详