2
class base
{
public:
    void virtual func(){cout<<"base";}
    void check()
    {
        func();
    }
};
class derived: public base
{
public:
    void func(){cout<<"dervied";}
};
int main()
{
    base *obj = new derived();
    obj->check();
    return 0;
}

上記のコードは、コンソールから派生したものです。これで、仮想関数の概念は理解できましたが、ここでは適用できません。私の理解では、仮想関数を呼び出すときはいつでも、コンパイラがへの呼び出しを変更し、"this->vptr->virtualfunc()"それが最も高度に派生したクラス関数が呼び出される方法です。しかし、この場合、check()は仮想関数ではないため、コンパイラfunc()は派生関数を呼び出す必要があるとどのように判断しますか?

4

2 に答える 2

7

コンパイラは、派生のfunc()を呼び出す必要があるとどのように判断しますか?

同じように-を呼び出すことによってthis->vptr->virtualfunc()。各派生クラスも基本クラスであるため、基本クラス内でも派生クラス属しthisていることを思い出してください。仮想関数にアクセスするのと同じ方法が機能します。

于 2012-04-15T11:09:57.313 に答える
2

vptrクラスのメンバーでを使用して、まさにあなたが言ったように。関数がvirtualであることを認識しているため、仮想関数テーブルを介して関数を呼び出す必要があることを認識しています。

于 2012-04-15T11:09:57.407 に答える