仮想関数に関して少し混乱しています。
仮想関数 foo() を持つ基本クラスがあり、その関数が派生クラスでオーバーライドされたとします。
class Baseclass
{
public:
virtual void foo()
{
//...
}
};
class Derived: public BaseClass
{
private:
int member_val;
public:
Derived( int init )
: member_val( init )
{}
void foo()
{
member_val++;
}
};
このコードを書くと、派生クラスのメンバー値を使用してfoo
Derived d( 10 );
Base* bPtr = &d;
bPtr->foo();
_vptr が「派生クラス仮想テーブル」を指し、「派生クラス仮想テーブル」のポインターが派生クラスの foo() を指しているため、派生クラスに対して foo() が呼び出されましたが、どのようにして member_val が見つかったのか、ベース ポインターがわかりません。それについて。Derived クラスから foo() に渡される "this" とは。Base* (これは Base 型) に対して呼び出しますが、 member_val を見つけるには Derived* (この Derived 型) が必要です。では、ボンネットの下でどのように機能するのでしょうか?