一,概述
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