class base {
public:
void virtual fn(int i) {
cout << "base" << endl;
}
};
class der : public base{
public:
void fn(char i) {
cout << "der" << endl;
}
};
int main() {
base* p = new der;
char i = 5;
p->fn(i);
cout << sizeof(base);
return 0;
}
ここ署名はder
クラスで定義された関数fn()
のシグネチャとは異なります。 したがって、der
クラスで定義された関数は、base
クラス関数fn()
を隠します。したがって、クラスder
のfnの呼び出しはp->fn(i)
コールでは呼び出せません。それは結構です。派生クラスが仮想関数をオーバーライドしない場合にvptrが必要なのはなぜですか?関数名は同じであるが<code>base</code>クラスで定義された関数fnの
私のポイントは、ある理由VTABLEポインタのない使用がない場合sizeof
クラスbase
またはder
が4
のですか? VTABLEポインタの要件は何ですか?
C++でオーバーロードについて聞いたことがありますか? –
@KamilKlimek:オーバーロードは、異なるシグネチャで複数の関数を宣言する行為です。おそらく、オーバーライド(派生クラスのメソッドを再実装すること)が意味します。あなたの種類の情報のために –
、これらは過負荷機能ではありません。 – user966379