2012-04-15 14 views
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()を呼び出す必要があると判断してどのようにしますか?通常の関数からの仮想関数呼び出し

答えて

7

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

同じexat方法で - this->vptr->virtualfunc()を呼び出すことによって。 thisクラスに属していることを想起してください。それぞれの派生クラスベースクラスでもありますから、仮想関数にアクセスするのと同じ方法でも同じことができます。

2

あなたの言ったとおりに、クラスメンバーのvptrを使用してください。関数がvirtualであることを知っているので、仮想関数テーブルを介して呼び出す必要があることがわかります。

関連する問題