web-dev-qa-db-ja.com

派生クラスオブジェクトが基本クラスに割り当てられている場合、基本クラスの非仮想関数はどのように呼び出されますか?

#include <iostream>

class Base {

private:
    int b_value;
public:
    void my_func() {std::cout << "This is Base's non-virutal my_func()" << std::endl; }

    virtual void my_Vfunc() {std::cout << "This is Base's virutal my_Vfunc()" << std::endl;}
};

  //----------------------------//


class Derived: public Base {

private:
    int d_value;
public:
    void my_func() {std::cout << "This is Derived's non-virtual my_func()" << std::endl; }

    virtual void my_Vfunc() {std::cout << "This is Derived's virtual my_Vfunc()" << std::endl;}
};


int main(){

Base * base = new Derived;
base->my_func();
base->my_Vfunc();

return 0; 
}

enter image description here

仮想関数の内部を理解しようとしていました。これまでのところ、Derived :: vfptrがあるため、base-> my_Vfunc()を実行しても、派生クラスをベースクラスにアップキャストすると仮想関数が呼び出されることを理解しています。

私の質問は、baseのmy_func()がここでどのように呼び出されるかです。私の主な混乱は、(アップキャスト中に)派生クラスオブジェクトが基本クラスの非仮想関数に関する情報をどのように提供するかです。

4
solti

非仮想関数は、コンパイラが認識する型に基づいて呼び出されます。 Base *変数がある場合、非仮想関数を呼び出すと、Base関数が呼び出されます。これが仮想と非仮想の違いです。仮想関数を呼び出すと、常にオブジェクトに適した関数が呼び出されます。

また、オブジェクトを割り当てていません。オブジェクトポインターを割り当てています。 (割り当て演算子を実装する必要がある)オブジェクトを割り当てた場合、オブジェクトはBaseオブジェクトになるため、仮想関数と非仮想関数の両方がBase関数を呼び出します。

4
gnasher729