1. 程式人生 > >類中成員函式呼叫問題

類中成員函式呼叫問題

虛擬函式執行時,跟指標型別沒有關係;跟作用域和虛擬函式表(new出來的物件有關)有關係;

       如果有作用域,根據作用域執行(不會走虛擬函式表,直接到程式碼段找),與new的型別和指標型別沒有關係;

       如果沒有作用域關鍵詞則根據虛擬函式表(與new物件有關)執行

非虛重寫函式執行時:跟new出來的物件沒有關係,跟作用域和指標型別有關係

      如果有作用域,則根據作用域呼叫(直接到程式碼段找);

      如果沒有作用域關鍵詞則根據指標型別呼叫,與new出來的物件型別無關;

父類和子類各自單獨擁有的函式:只與函式指標型別有關;

#include<iostream>

class Father
{
public:
Father()
{
printf("father 構造!\n");
}
void show()
{
printf("FathterShow!\n");
}
virtual void virtualshow()
{
printf("father virtualshow!\n");
}
~Father()
{
printf("Father 析構!\n");
}
};
class Son :public Father
{
public:
Son()
{
printf("Son 構造!\n");
}
void show()
{
printf("SonShow!\n");
}
virtual void virtualshow()
{
printf("Son virtualshow!\n");
}
~Son()
{
printf("Son 析構!\n");
}

};

虛擬函式執行:如果有作用域關鍵字則執行的虛擬函式只與作用域有關,與new出來的物件型別沒有關係,圖1,new Father,但是由於Son::作用輸出Son中的虛擬函式;

 

虛擬函式執行:

new 出來的是Father,則虛擬函式表中為Father類中的函式,呼叫父類中的虛擬函式;與指標型別無關;若new出來的是Son型別的則虛擬函式表中的為子類的中的函式,呼叫子類中函式

 

父子間非虛擬函式類成員重寫:跟new出來的物件沒有關係,跟作用域和指標型別有關係

 

父類和子類各自單獨擁有的函式:只與函式指標型別有關;//不推薦定義父類的物件,去呼叫子類獨有的函式!