別の質問を参照する
コードを考えてみましょう:
class Base {
public:
virtual void gogo(int a){
printf(" Base :: gogo (int) \n");
};
virtual void gogo(int* a){
printf(" Base :: gogo (int*) \n");
};
};
class Derived : public Base{
public:
virtual void gogo(int* a){
printf(" Derived :: gogo (int*) \n");
};
};
int main(){
// 1)
Derived * obj = new Derived ;
obj->gogo(7); // this is illegal because of name hiding
// 2)
Base* obj = new Derived ;
obj->gogo(7); // this is legal
}
ケース2の場合)
呼び出しobj->gogo(7)
は実行時に解決されます。
obj->gogo(7)
は合法なので。のvtableには、非表示になっているはずのDerived
ptrが含まれ
ていることを意味しているようです。virtual void gogo(int a)
私の混乱は、名前を隠すとケース1)が違法になるため、2)の呼び出しが実行時にどのように解決されるかです。
a)Derivedのvtableにはgogo(int)へのポインターが含まれていますか?
b)a)が真でない場合、仮想関数の呼び出し解決は基本クラスのvtableに進みますか。