#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;
}
輸出結果是base fun1和base fun2
因為son沒有重新定義fun3,就直接獲取到父類的函數地址運行,這里沒有進行動態綁定的判斷,是直接獲得。當子類的函數沒有被重寫,子類會直接找到父類的函數地址進行運行,virtual和非virtual得區別在于,聲明的對象virtual可以用父類的指針來聲明,在調用函數的時候,系統會動態綁定真正的函數地址。