#include <stdio.h>
#include <vector>
using namespace std;
class CBase
{
public:
CBase()
{
}
~CBase()
{
}
virtual void fun1()
{
printf("base fun1\n");
}
void fun2()
{
printf("base fun2\n");
}
void fun3()
{
fun1();
fun2();
}
};
class CSon : public CBase
{
public:
CSon()
{
}
~CSon()
{
}
void fun2()
{
printf("son fun2\n");
}
};
int main()
{
CSon son;
son.fun3();
return 0;
}
輸出結(jié)果是base fun1和base fun2
因?yàn)閟on沒(méi)有重新定義fun3,就直接獲取到父類的函數(shù)地址運(yùn)行,這里沒(méi)有進(jìn)行動(dòng)態(tài)綁定的判斷,是直接獲得。當(dāng)子類的函數(shù)沒(méi)有被重寫,子類會(huì)直接找到父類的函數(shù)地址進(jìn)行運(yùn)行,virtual和非virtual得區(qū)別在于,聲明的對(duì)象virtual可以用父類的指針來(lái)聲明,在調(diào)用函數(shù)的時(shí)候,系統(tǒng)會(huì)動(dòng)態(tài)綁定真正的函數(shù)地址。